2017-04-02 12 views
0

私持っている私は関数を呼び出す問題が発生したと、この機能が、常にそれを呼び出す適切な対応NodeJSエクスプレス非同期問題

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

return x; 
}); 

と別の関数を得ている私のデータベースからいくつかのデータを取得しますが、この機能undefinedを返します。 mongooseが配列を埋めるまで関数を待機させるにはどうしたらいいですか?

ありがとうございました! 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 
}) 

クエリの仕組みについては、mongoose docsをお読みください。

また、マングースの約束をサポートしています。約束の詳細については、this urlを参照してください。

0

@orhankutluが提案した解決策はうまくいくはずです。

私は約束を使用して別のソリューションを提供します。あなたのプログラミングのスタイルに応じて、これらの2つのソリューションの中から1つを選択できます。約束を使用して

ソリューション:私はコールバックを使用し、約束を使用して、すなわち、両方のアプローチを試してみることをお勧めします

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

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()を呼び出します。あなたはそれが有用であることを願っています!