코드에 연결된 모든 데이터베이스 querys 실행 한 후에 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 라이브러리와 같은 것을 사용할 것을 제안 할 것이다. 특히, eachLimit : http://caolan.github.io/async/docs.html#.eachLimit – Brant
사용 Promise의, 특히 Promise.all - 라이브러리가 필요 없음 –
@JaromandaX 아이디어에 감사하지만 확실하지 않습니다. id가 루프의 끝에서 호출하는 것처럼 resolve 함수를 호출 할 수있을 때 모든 쿼리가 반환되지 않았을 수 있으며 쿼리 내부에서 호출하고 싶다면 그 것을 알 수있는 방법이 없습니다. 검색어가 마지막 것입니까? –