0
在附加的代碼中,我希望在所有數據庫查詢都運行後運行函數returnFile
,但問題是我無法確定哪個響應將是查詢內部的最後一個反應,所以我在想的是分開循環,只是最後一個回調運行returnFile
函數,但這會大大減慢速度。確定異步循環的結尾
for (var i = 0, len = articleRevisionData.length; i < len; i++) {
tagNames=[]
console.log("step 1, "+articleRevisionData.length+" i:"+i);
if(articleRevisionData[i]["tags"]){
for (var x = 0, len2 = articleRevisionData[i]["tags"].length; x < len2; x++) {
console.log("step 2, I: "+i+" x: "+x+articleRevisionData[i]["articleID"])
tagData.find({"tagID":articleRevisionData[i]["tags"][x]}).toArray(function(iteration,len3,iterationA,error, resultC){
console.log("step 3, I: "+i+" x: "+x+" iteration: "+iteration+" len3: "+len3)
if(resultC.length>0){
tagNames.push(resultC[0]["tagName"]);
}
//console.log("iteration: "+iteration+" len: "+len3)
if(iteration+1==len3){
console.log("step 4, iterationA: "+iterationA+" I: "+iteration)
articleRevisionData[iterationA]["tags"]=tagNames.join(",");
}
}.bind(tagData,x,len2,i));
}
}
if(i==len-1){
templateData={
name:userData["firstName"]+" "+userData["lastName"],
articleData:articleData,
articleRevisionData:articleRevisionData
}
returnFile(res,"/usr/share/node/Admin/anonymousAttempt2/Admin/Articles/home.html",templateData);
}
}
其他人已經解決了這個問題。我建議使用Caolan的AyncJS庫。具體來說,每個限制: http://caolan.github.io/async/docs.html#eachLimit – Brant
使用Promise和更具體Promise.all - 無需庫 –
@JaromandaX感謝您的想法,但我不確定當id能夠調用解析函數,就好像我在循環結束時調用它所有的查詢可能還沒有返回,如果我想從查詢內部調用它,我無法知道這一點查詢是最後一個? –