2017-08-12 10 views
0

の非同期を処理することができません:は、私はそのようなコードを持っているJavaScriptの-NodeJS

function onDoneFunction() 
    { 

    console.log("done!"); 

    } 

    function generalQuery(generalArray, onDoneFunction) 
    { 

    function go(i) 
    { 

     if(i >= generalArray.length) 
     { 
      onDoneFunction(); 
     } 
     else 
     { 
      iteratorFunction(generalArray[i], function() 
      { 
      console.log("entering callback " + i); 
      return go(i + 1); 
      }); 

     } 
    } 

    go(0); 
    } 

そして、私のiteratorFunctionは次のようになります。

function iteratorFunction(partofquery, callback) 
{ 
    var index = generalArray.indexOf(partofquery); 

    collection.find(partofquery).then(function(data) 
    { 
     console("query completed " + index); 
    } 
} 

は、私のクエリ配列は、2つの要素を持っていると仮定すると、私はそのような見出力:

入るコールバック0

クエリが0

を完了し、コールバックに入る

:1

クエリが0

クエリが1

を完了した。しかし、私はこれを見しようとしている完成入るコールバック

enter INGのコールバック1

問い合わせは、私は次のいずれかを開始する前に終了する反復のためのループ待機をしようとしてきた1

を完了しました。私は多くのことを試みました。ご覧のとおり、再帰を使ってみました。しかし、私はそれを達成できません。私が間違っていることを私に見せてください。前もって感謝します。あなたのコード

function onDoneFunction() { 
 
    console.log("done!"); 
 
} 
 

 
function iteratorFunction(partofquery, index) { 
 
    return collection.find(partofquery).then(function(data) { 
 
     console("query completed " + index); 
 
    }); 
 
} 
 

 
function generalQuery(generalArray, onDoneFunction) { 
 
    function go(i) { 
 
     if (i < generalArray.length) { 
 
      console.log("performing query " + i); 
 
      return iteratorFunction(generalArray[i], i).then(function() { 
 
       return go(i + 1); 
 
      }); 
 
     } 
 
    } 
 
    go(0).then(onDoneFunction); 
 
}

+0

'。それから、あなたはそれを見ていくつかの約束を結ぶ必要があります。 –

+0

@JaromandaX私のコードを使って例を示してください。 – jason

+0

[非同期呼び出しから応答を返すにはどうすればよいですか?](https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) –

答えて

1

最も簡単な修正がしかし、再帰は最善の解決策ではない - しかし、あなたは、Array#を使用してan example using my code

をお願いしたの削減の代わりに、再帰

function generalQuery(generalArray, onDoneFunction) { 
    generalArray.reduce((promise, item, index) => 
     promise.then(() => 
      iteratorFunction(item, index) 
     ), 
     Promise.resolve() 
    ).then(onDoneFunction); 
} 
+0

'onFunctionDone'と' onDoneFunction'は同じですか? – jason

+0

待機 - 私はうんざりしました –

+0

コールバックをキャンセルして約束を使用するだけでいいですか? – jason

関連する問題