2017-09-19 12 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

約束方法:

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関数を呼び出します。

Nodesイベントループアーキテクチャを利用していないため、なぜ同期コードが必要なのかわかりません。

私が行うことは、Promise.eachでBluebird(http://bluebirdjs.com/docs/api/promise.each.html)などの良いPromisesフレームワークを使用して、各繰り返しが連続的に発生することを保証することです。または、asyncc.eachSeriesでasync()などのコールバックライブラリを使用することもできます。どちらの場合でも、(a)非同期の利点を得ること、(b)連続的に反復することが保証されます。