2016-05-08 8 views
0

FindOneの非同期に問題があります。私はidChildren([516152]、[158796]、[123654,147852])のようなidの配列を持っています)、配列上の現在の位置のidがデータベース上にあるかどうかをチェックしたいと思います。 childrenは、すべての情報で文字列を保存する配列です。FindOneのAsync.eachSeriesが機能しない

for (var j = 0; j < idChildren.length; j++) 
{ 
    async.eachSeries(idChildren, function() { 
     for (var i = 0; i < idChildren[j].length; i++) 
     { 
      Children.findOne({ _id: idChildren[j] }, function (err, child) { 
       console.log("I'm in the findOne"); 
       if (child != undefined && !err) { 
        if (child.lastname == undefined) 
         tmp2 += ','; 
        else 
         tmp2 += child.lastname + ','; 
        if (child.firstname == undefined) 
         tmp2 += ','; 
        else 
         tmp2 += child.firstname + ','; 
        if (child.birthday == undefined) 
         tmp2 += ','; 
        else 
         tmp2 += child.birthday + ','; 
        tmp2 += '\n'; 
       } 
       children.push(tmp2); 
       tmp2 = ""; 
      }); 
     } 
    }); 
} 
console.log(children); 

"console.log(子)" print [、、]と "私はfindOneにいる"の直後に3回問題があります。私はasync.eachSeriesが正しくないと思う。 私を助けることができますか?

EDIT

async.eachSeries(idChildren, function(idChild, next) { 
    Children.findOne({ _id: idChild }, function (err, child) { 
     console.log("I'm in the findOne"); 
     if (child != undefined && !err) { 
      if (child.lastname == undefined) 
       tmp2 += ','; 
      else 
       tmp2 += child.lastname + ','; 
      if (child.firstname == undefined) 
       tmp2 += ','; 
      else 
       tmp2 += child.firstname + ','; 
      if (child.birthday == undefined) 
       tmp2 += ','; 
      else 
       tmp2 += child.birthday + ','; 
      tmp2 += '\n'; 
     } 
     children.push(tmp2); 
     tmp2 = ""; 
     next(); 
     return; 
    }); 
}); 

console.log(children); 

出力は次のとおりです。

[]
私は私がfindOneによfindOne
によfindOneに

私はfindOneにいます
私はfindOneにいます

したがって、console.log(子)が最初に実行され、FindOneループの直後に実行されます。 findOneの最後にconsole.log(子)がある場合、配列は正しいです。

+0

私は私の答えを編集しました –

答えて

0

正しく理解すれば、コードは正常に動作し、問題はconsole.log()とループの最後に実行する他のロジックのタイミングでのみ発生します。

場合この場合は、次のコードを使用します。あなたが見ることができるように

async.eachSeries(idChildren, function(idChild, next) { 
    Children.findOne({ _id: idChild }, function (err, child) { 
     console.log("I'm in the findOne"); 
     if (child != undefined && !err) { 
      if (child.lastname == undefined) 
       tmp2 += ','; 
      else 
       tmp2 += child.lastname + ','; 
      if (child.firstname == undefined) 
       tmp2 += ','; 
      else 
       tmp2 += child.firstname + ','; 
      if (child.birthday == undefined) 
       tmp2 += ','; 
      else 
       tmp2 += child.birthday + ','; 
      tmp2 += '\n'; 
     } 
     children.push(tmp2); 
     tmp2 = ""; 
     next(); 
     return; 
    }); 
}, 
// finally method 
function(err) { 
    if (err) { 
     //do some error handling 
    } 

    console.log(children); 
    // do some other logics 
}); 

を、async.eachSeries方法は、「最終的方法」の略で、別の関数パラメータ受け入れ - 呼び出されるメソッドをループが完了した後

ループの反復の一つは次のエラーのために立つパラメータと呼ぶ場合 - のような:

return next("Cannot find child object"); 

その場合には - 最終的にパラメータをループが実行を停止し、「誤ります」メソッドはエラーとして渡された文字列を含みます。

エラーがなかった場合、「エラー」はnullになり、必要なロジックを実行し続けることができます。

+0

あなたの答えをありがとう。残念ながら、私のWebコンソールは以下を出力します。 04:27:45 web.1 | [] 04:27:45 web.1 |私はfindOneにいる 04:27:45 web.1 |私はfindOneにいる 04:27:46 web.1 |私はfindOneにいる 04:27:46 web.1 |私はfindOneにいる 04:27:46 web.1 |私はfindOneにいます async.EachSeriesに入った直後に子どもが最初に印刷されるので、子変数は常に空です。/ –

+0

コード全体を変更して添付してください。質問があるので、正確に何が問題なのか理解できます。 –

+0

私は最初の投稿を編集しました。ありがとうございました ! –

関連する問題