2017-08-12 64 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); 
    } 
} 

假如我的查詢數組有兩個元素,我看到這樣的輸出:

進入回調0

進入回調1個

查詢完成0

查詢完成1

但我想看到這一點:

進入回調0

查詢完成0

enter荷蘭國際集團的回調1

查詢完成1

我一直在努力使循環等待迭代開始下一個之前完成。我嘗試了很多東西。正如你所看到的,我也嘗試過使用遞歸。但我無法做到這一點。你能告訴我我做錯了什麼嗎?提前致謝。

+0

'。那麼' - 啊,所以你需要鏈接一些承諾,看它的外觀 –

+0

@JaromandaX你可以用我的代碼示例顯示嗎? – jason

+0

可能重複[如何從異步調用返回響應?](https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) –

回答

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); 
 
}

然而,遞歸是不是最好的解決方案 - 但你沒有問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