2017-01-05 15 views
1

次のコードは正しく動作しますが、非同期ループ(カウントは非同期)の一般的な方法です。だからコールバックする前に、私は3つの数字を記録し、原理的には違う。非同期ループの場合

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つの数字を得ることですlikesPartial配列は各ステップで異なる数の要素を持つため、原則的に異なるはずですが、最後にコールバックされるもの)

2つの例は私に類似しているように見えます。そのため、エラーが見つかりません。

ありがとうございました。

+0

私はmongooseを知らないが、 'for'は' async'にすることはできません。ループのための再帰を調べることができます。 – Rajesh

+0

**あなたは何をしたいですか** 2番目の例は何ですか? –

+0

厳密に言えば、「内部に非同期関数を持つことはできません」という意味だと思います。その場合、私は「いいえ」と言います。例1が動作します。私はこれが最善の方法であるかどうかは分かりませんが、そのようにすることができます – sheriff

答えて

0

最初の例では、コールバックごとにcountを更新しています。最後のコールバックが来たら、callbackと呼び出し、最終結果はcountになります。どちらが理にかなっている。

あなたの第二の例は著しく異なっている:それは、複数の値を受信するが、すべてが、(それらをログに記録する以外の)最後の1を無視して、それが受け取るだけで、最後ucallbackを呼び出します。したがって、以前受信したuは破棄され、すぐには意味を持たないように見えます(何がuであるかわからないため、操作が非同期であると仮定しているため、順序どおりに完了することはできません)。私が指摘し


もう一つはこれです:

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

あなたはの配列に毎回渡している、あなたの最初のコードスニペットでは、あなたは、単一のIDを渡しているのに対し、arrayIds[i])、配列ではありません。

+0

さて、彼らは完全に類似していません。 uの2つの値はコールバックされず、IN THAT RESPECTで失われます。 しかし、ログに関しては、私は第1の例と同じように3つの異なるログを持つべきです。 – sheriff

+0

@sheriff:はい。それはすべてが同じ価値を持っていることは起こり得ないというわけではありません。 –

+0

@sheriff:あなたはまた、著しく異なるパラメータを呼び出しに渡しています。上記の更新を参照してください。 –

関連する問題