2014-04-21 1 views
3

for 루프를 실행 중입니다. 루프 내에서 postgresql 쿼리를 실행하고 결과를 배열에 채우고 있습니다. 그러나 나는 실행 흐름을 예측할 수 없습니다.node.js + for loop + query execution

내 코드 : 내가 필요로 무엇

var array =[]; 
     for(var i = 0 ; i< latitude.length; i++){  
    client.query("SELECT value->>'xxxx' as xxxx_details FROM yyyyy WHERE ST_DWithin(ST_GeogFromText('SRID=4326;POINT ("+latitude[i]+" "+longitude[i]+")'), geography(the_geom), " + radius + ")", function(err, row, fields) {    
         array.push(row.rows[0]); 
     } 
       console.log("bbbbbbbbb=" +array); 

내가 모든 쿼리가 for 루프 내에서 실행 된 후 어레이를 인쇄 할 수 있습니다. 그러나 이제 배열 앞에 인쇄가 시작됩니다. 이 문제를 해결하도록 도와주세요. 미리 감사드립니다.

+0

적어도 하나의 닫는'})'! – Bergi

+0

충분히 간단하고 SQL에 대한 콜백이 증가하는 카운터를 유지하고 해당 카운터가 위도에 도달하면 모두 완료됩니다. – adeneo

답변

5

이유는 client.query가 콜백에서만 사용할 수있는 비동기식이기 때문입니다.

하나의 옵션은 async.js입니다. 좋은 쓰기 when to use what here.

해당 기사에서 컬렉션의 각 항목에 대한 코드를 실행할 수 있습니다. 예를 들어, SQL 쿼리 문 배열을 작성한 다음 각 쿼리에 대해 일부를 실행하려면 인덱스 배열이나 foreach 배열을 사용할 수 있습니다.

쿼리는 쿼리의 배열 등에 무언가 인 경우 :도 1 (순차)의 한계가 병렬로 n 및 forEachSeries 하 거기 forEachLimit있어

async.forEach(queries, function(query, callback) { 
    client.query(query, function(err, row, fields){ 
     array.push(row.rows[0]); 
     callback(); // this signals async that you're done with this item 
    }); 
}, function(err) { 
    if (err) return next(err); 

    // all queries are done here 
}); 

참고.

편집 :

더 나은 옵션 (발전기가) 4+ 비동기/await를 사용하면 타이프 라이터를 사용하고 ES6 +로 컴파일하고 노드를 사용하는 경우 현재 사용할 수있는 것입니다.

나는 루프에서 비동기 호출을 기다리고 그 REPO 쇼에서이 sane node repo

스 니펫에서 세부 사항을 다룹니다. 비동기로 유지하고 완료 될 때까지 다음 행으로 진행하지 않습니다. 이것은 또한 try/catch 처리의 이점을 기대할 수 있습니다.

// await allows us to write linear code. 
// makes it easy to also call async code in a loop 
// offers easy error handling with try catch 
var quotes: IQuote[]; 
var tries: number = 0; 
while (true) { 
    try { 
     ++tries; 
     // ASYNC/AWAIT 
     quotes = await this._store.find<IQuote>({}); 
     break; 
    } 
    catch (err) { 
     if (tries == 3) { throw err; } 
    } 
} 

return quotes; 
+0

'forEach'는 사용하지 말고'map'을 사용하십시오. 그'array' 것은 제거되어야합니다. – Bergi

+0

병렬 async.js 메서드를 사용하는 것은 MySQL이 연결 당 한 번에 하나의 쿼리 만 실행할 수 있기 때문에 * 시리즈 버전의 함수를 사용하는 것과 동일하다는 점에 유의해야합니다. – mscdex