2013-10-28 2 views
0

resultofgetCauses이 정의되지 않은 이유는 무엇입니까? 함수가 currentCauses을 반환하지 않거나 resultofgetCauses에 할당되지 않은 경우 확실하지 않습니다. . . 또는 이것이 비동기와 관련이있는 경우. currentCauses가 비동기로 초기화할당 후 변수가 정의되지 않음

function getCauses(){ 

    var currentCauses; 
    client = pg.connect(connectionString, function(err, client, done){ 

    if(err) console.log(err); 

    client.query('SELECT * FROM causes', function(err, result){ 
     //console.log(result.rows); 
     console.log('poo'); 
     currentCauses=result.rows; 
     //console.log(currentCauses); 
    }); 

    }); 

    return currentCauses; 
}; 

var resultofgetCauses = getCauses(); 
+3

비동기 코드를 다음과 같이

플러스는 함수를 정의하는 것이 좋습니다입니까? 여기를 참조하십시오 http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call – elclanrs

+0

그것은 비동기 문제라고 생각하지 않습니다. –

+1

그것은 'currentCauses **'pg.connect'가 완료되기 전에'resultofgetCauses'가 ** 할당되기 때문에'undefined'가됩니다. 그 질문은 당신의 문제에 대한 심층적 인 해결책을 가지고 있습니다. – elclanrs

답변

2

예는 result.rowscurrentCauses 변수에 할당 된 시간만큼, asynchronously 실행 이후, 라인 'return currentCauses' 이미 값이 정의되지 따라서 실행되었다.

당신은 다음과 같은

var resulttofgetCauses; 
function getCauses(){ 
    var currentCauses; 
    client = pg.connect(connectionString, function(err, client, done){ 
     if(err) console.log(err); 
     client.query('SELECT * FROM causes', function(err, result){ 
      //console.log(result.rows); 
      console.log('poo'); 
      currentCauses=result.rows; 
      //console.log(currentCauses); 
      resulttofgetCauses = currentCauses; 
     }); 
    }); 
}; 
getCauses(); 

대답과 함께 구체적으로는 그렇게 할 수 있습니다 'SELECT * FROM causes' SQL을 실행하면 바로 실행 시간 후 당신에게 결과를 제공하지 않습니다. 데이터베이스에서 데이터를 검색하는 데 최소한 0.00 초 이상 걸립니다. 따라서 '실행중인 sql'과 '요청 된 데이터 수신'사이의 아주 짧은 시간에 JavaScript는 이미 return currentCauses;을 실행했지만 올바른 데이터는 여전히 검색 진행 중에 있습니다. 비동기식이어서 대기하지 않기 때문입니다. 거기에 좋은 예제 코드는 인터넷에 체크 아웃 할 수 있습니다.

getCauses = function() { ... } 
0

때문에 기능을 이미 getCauses 함수에서 반환 한 후 (pg.connect에 PARAM로 전달 된 함수)를 호출. 반환 할 때 currentCauses의 값은 정의되지 않습니다.

관련 문제