2017-04-02 3 views
0

I가 내가 기능을 요구하는 문제가이 기능을하지만 항상 호출 적절한 응답NodeJS 익스프레스 비동기 문제

function getEvents() 
    { 
    var x = []; 
    var l = dbCollection['e'].find({}).forEach(function(y) { 
    x.push(y); 
    }); 

return x; 
}); 

및 다른 기능을지고있어 내 데이터베이스에서 일부 데이터를 얻을 수 있지만,이 기능 undefined를 반환합니다. 몽구스가 배열 채우기를 완료 할 때까지 함수를 대기 상태로 만들 수 있습니까?

도움 주셔서 감사합니다. My life

+0

돌아 오는 데 콜백 전략을 사용하고 몽구스 문제를 해결하기 위해 어떤 약속 관리를해야합니다. – Iceman

+0

@ JJ9 질문에 답이 나온다면 열어 두지 마십시오. – orhankutlu

답변

0

dbCollection['e'].find은 차단되지 않는 방법으로 기입하기 전에 x을 반환합니다. 콜백 또는 몽구스 약속을 사용해야합니다. 당신은 당신이 그것에 콜백을 전달해야 getEvents 함수를 호출 할 때마다 조각을

function getEvents(callback) { 
    dbCollection['e'].find({}, function(error, results) { 
     // results is array. 
     // if you need to filter results you can do it here 
     return callback(error, results); 
    }) 
} 

을 다음과 같이 데이터베이스에서 모든 반환 값을 얻을 수 있습니다.

getEvents(function(error, results) { 
    console.log(results); // you have results here 
}) 

당신은 쿼리가 작동하는 방법에 대한 몽구스 docs을 읽어야합니다.

몽구스에 대한 약속도 지원됩니다. 약속에 대한 자세한 내용은 this url을 확인하십시오.

0

@orhankutlu가 제안한 해결책은 잘 작동합니다.

약속을 사용하는 다른 해결책을 제공 할 것입니다. 사용자는 프로그래밍 스타일에 따라이 두 솔루션 중 하나를 선택할 수 있습니다.

솔루션 사용하여 약속 :

function getEvents() { 
    return new Promise(function(resolve, reject){ 
     dbCollection['e'].find({}, function(error, results) { 
      if (error) return reject(error); 

      var x = []; 
      results.forEach(function(y){ 
       x.push(y); 
      }); 
      // forEach() is a blocking call, 
      // so the promise will be resolved only 
      // after the forEach completes 
      return resolve(x); 
     }); 
    }); 
}; 

호출 getEvents() :

getEvents().then(function(result){ 
    console.log(result); //should print 'x' 
}).catch(function(err){ 
    // Handle error here in case the promise is rejected 
}); 

내가 콜백을 사용하고 약속을 사용하여, 즉 접근 방법을 모두 시도하는 것이 좋습니다 것입니다. 희망 당신은 그것을 유용하게 찾을 수 있습니다!