2017-01-05 6 views
1

다음 코드는 올바르게 작동합니다. 비동기 루프를 수행하는 일반적인 방법입니다 (개수가 비동기 임). 따라서 콜백하기 전에 원칙적으로 3 개의 숫자가 기록됩니다.비동기 for 루프

var arrayIds = ['a', 'b', 'c']; 
var totalIds = arrayIds.length; 
var done = 0; 
var count = 0; 
for (var i = 0; i < arrayIds.length; i++) { 
    mongoose.Model.count({ 'likes.id': arrayIds[i] }, function (err, c) { 
     count += c; 
     console.log(c); 
     if (++done < totalIds) return; //else 
     callback(count); 
    }) 
} 

하지만이 같은 철학이 다른 경우에 무슨 일이 일어나고 있는지 모르겠어요, 도와주세요 :

var arrayIds = ['a', 'b', 'c']; 
var totalIds = arrayIds.length; 
var done = 0; 
var likesPartial = []; 
for (var m = 0; m < arrayIds.length; m++) { 
    likesPartial.push(arrayIds[m]); 
    profiles.count({ 'likes.id': { $in: likesPartial } }, function (err, u){ 
     console.log(u); 
     if (++done < totalIds) return; //else 
     callback(u); 
    }) 
} 

문제는 내가 함께 (로그인 같은 3 개 개의 숫자를 얻을 수 있다는 것입니다 기대되는 마지막 'u'의 값, 결국 하나의 콜백), likesPartial 배열은 각 단계마다 다른 수의 요소를 가지고 있기 때문에 원칙적으로 달라야합니다.

두 가지 예는 저와 유사하므로 오류를 찾을 수 없습니다.

감사합니다.

+0

몽구스는 모르지만'for '는'async'가 될 수 없습니다. 루핑을 위해 재귀를 조사 할 수 있습니다. – Rajesh

+0

** 원하는 것은 무엇입니까 ** 두 번째 예제는 무엇입니까? –

+0

엄밀히 말하면, "비동기 함수를 내부에 가질 수 없다"는 것을 의미한다고 가정합니다. 그 경우, 나는 "아니오"라고 말합니다. 예제 1이 작동합니다. 나는 이것이 일을하는 가장 좋은 방법이라고 확신하지 못한다. 그러나 그들은 그런 식으로 행할 수있다. – sheriff

답변

0

첫 번째 예에서는 각 콜백마다 count을 업데이트하고 마지막 콜백이 들어 오면 callback을 호출하고 최종 결과는 count입니다. 어떤 의미가 있습니다.

두 번째 예는 현저하게 다르다 : 그것은 여러 값을 받지만 제외한 모든 (을 로그인 이외의) 마지막을 무시하고는 수신 단지 마지막 ucallback를 호출합니다. 따라서받은 이전 u은 버려지고 즉각적으로 보이지는 않습니다 (적어도 u이 무엇인지 알 수 없기 때문에 작동은 비동기이며 임의의 순서로 완료 할 수 있음).


내가 언급 한 또 다른 점은 이것이다 : 당신은 배열에 전달하는

profiles.count({ 'likes.id': { $in: likesPartial } }, function (err, u){ 
// ----------------------------^^^^^^^^^^^^^^^^^ 

마다의은, 반면에 귀하의 첫 번째 코드에서, 당신은 하나의 ID를 전달하는 (arrayIds[i])이며 배열이 아닙니다.

+0

좋아, 그들은 완전히 유사하지 않습니다. u의 2 개의 값은 콜백되지 않고 그 것으로 상실됩니다. 하지만 로그에 관해서는 첫 번째 예제와 같은 방식으로 3 가지 로그가 있어야합니다. 그렇지 않아야합니까? – sheriff

+0

@ 보안관 : 예. 그렇다고해서 모든 사람들이 같은 가치를 지닐 수는 없습니다. –

+0

@sheriff : 또한 현저하게 다른 매개 변수를 호출에 전달합니다 (위의 업데이트 참조). –