2017-09-19 2 views
-1

NodeJS를 사용하여 ID 목록에서 데이터베이스 정보를 얻고 객체 배열을 채 웁니다. 나는 동 기적으로 처리 할 필요가있다. 다음 함수 호출이 호출되기 전에 이전 함수 호출이 끝날 때까지 기다릴 수 있도록이 작업을 수행하는 방법을 파악하는 데 문제가 있습니다. 그런 다음 '각'반복 작업 모두를 호출하여 반환을 완료합니다.NodeJS 동기 문제

예 :

getInfo(); 

function getInfo(){ 
    var return_arr = Array(); 
    var ids = getListOfIDs(); 
    // loop through each id getting more info from db 
    $.each(ids, function(i, v){ 
     return_arr.push(getFullInfo(id)); 
    }); 
    return return_arr; 
} 

function getListOfIDs(){ 
    // database call to get IDs 
    // returns array 
} 

function getFullInfo(){ 
    // database call to get full info 
    // returns object 
} 

이 단순화 된 예입니다, 그래서 가서 JS에서 개최 할 필요가 후 처리 조인 여러가있는 모든 정보를 얻을 수있는 하나의 쿼리가 작동하지 않습니다 가정합니다. 또한 적절한 오류 처리를 수행하고 있다고 가정합니다.이 예에서는 생략했습니다.

답변

0

데이터베이스 쿼리가 비동기 적이므로 데이터베이스에서 결과를 반환하고 나면 콜백 또는 약속을 사용하여 작업을 수행해야합니다.

function getListOfIDs(callback) { 
    // database call to get IDs 
    db.query('...', function(data) { 
    // call the callback and pass it the array 
    callback(data); 
    }); 
} 

function getInfo() { 
    // pass an anonymous function as a callback 
    getListofIDs(function(data) { 
    // we now have access to the data passed into the callback 
    console.log(data); 
    }); 
} 
+0

콜백은 호출이 동 기적으로 처리되는 것을 보장하지 않습니다. 코드 예제에 약속을 제공 할 수 있습니까? – user6041966

+0

콜백은 내 이해에서 동 기적으로 통화를 처리하도록 보장합니다. 당신은 단지 그것들을 가지고 이전의 것들을 호출해야합니다. – zhangjinzhou

+0

물론 약속 코드는 여러 수준을 포함시키지 않고 더 깨끗합니다. 그러나 콜백은 동기 문제를 해결하는 데 문제가 없어야합니다. – zhangjinzhou

-2

약속 방법은 그것을 할 수 있습니다 : 나는 당신의 DB 코드가 어떻게 작동하는지 모르겠지만

function getListOfIDs() { 
    return new Promise((resolve, reject) => { 
     // database call 
     if (err) 
     { 
      reject(your_db_err); 
      return; 
     } 
     resolve(your_db_result); 
    }); 
} 

function getInfo() { 
    getListOfIDs().then((result) => { 
     //do whatever you want with result 
    }) 
    .catch((err) => { 
     //handle your err 
    }); 
} 
+0

왜 투표가 중단됩니까? – zhangjinzhou

+0

솔직히 나는 그것이 투표의 가치가 있다고 생각하지 않는다. (개인적으로는 의견이없는 투표를 싫어한다.) 그러나 아마도 그것은 해결/거부 처리에 대한 조건이 없었을 것이다. – akaphenom

+0

아마도 이것이 문제입니다. 나는 그것을 추가 할 것이다. – zhangjinzhou

-1

현재 코드 예제는 동기입니다. 각 루프는 동기식이므로 ID를 반복하고 getFullInfo 함수를 호출합니다.

노드 이벤트 루프 아키텍처를 사용하지 않기 때문에 왜 동기 코드가 필요한지 잘 모르겠습니다.

나는 Promise.each가 Bluebird (http://bluebirdjs.com/docs/api/promise.each.html)와 같은 좋은 약속 프레임 워크를 사용하여 각 반복이 순차적으로 발생하는지 확인합니다. 또는 asyncc.eachSeries에 async (http://caolan.github.io/async/)와 같은 콜백 라이브러리를 사용할 수도 있습니다. 이 두 가지 방법을 통해 (a) 비동기식 이점을 얻고 (b) 직렬 방식으로 반복 할 수 있습니다.