0

私は複数のコールバックを実行しようとしていますが、同時に配列に値を格納していますが、最後の配列では空を返します。ここでノードjsで複数の非同期コールバックの後に配列値を保持する方法はありますか?

は私のコードです:

私が間違っているの
var sheetData = []; 
async.forEachSeries(req.body.data, function (data, cb) { 
    sheet.find({accountid: req.body.id}, function (err, doc) { 
     if (doc == '') {// get the next worksheet and save it 
      var sheet = new sheet({ 
       accountid: req.body.id, 
       sheetid: data.sheetid 
      }); 

      var jsonData = {}; 
      jsonData.sheetid = data.sheetid; 

      sheet.save(function (err, doc) { 
       if (!err) { 
        sheetData.push(jsonData); // trying to push in array , success 
        console.log("-----sheet data---- : ", sheetData);// data available here 
       } 
      }); 
     } 
    }); 
    cb(); 
}, function() { 
    console.log("-----sheet data---- : ", sheetData);// empty array 
}); 

?誰も私を提案することはできますか? または、nodejsに他の代替手段がある場合。

ありがとうございます。

答えて

0

コールバックが早く呼び出されています。以下を試してください:

var sheetData = []; 
async.forEachSeries(req.body.data, function (data, cb) { 
    sheet.find({accountid: req.body.id}, function (err, doc) { 
     if (!doc) { 
      return cb(); //sheet exists, call back early 
     } 

     // get the next worksheet and save it 
     var sheet = new sheet({ 
      accountid: req.body.id, 
      sheetid: data.sheetid 
     }); 

     var jsonData = {}; 
     jsonData.sheetid = data.sheetid; 

     sheet.save(function (err, doc) { 
      if (!err) { 
       sheetData.push(jsonData); // trying to push in array , success 
       console.log("-----sheet data---- : ", sheetData);// data available here 
       cb(); // all done, now we can call back 
      } 
     }); 
    }); 
}, function() { 
    console.log("-----sheet data---- : ", sheetData);// lots of sheets 
}); 
+0

残念ながら、もう一度すべてのsheetDataを最後に取得しません。空っぽです。 – uday214125

+0

私はこれを(doc!== '')に変更したときに(doc!= '')その正常に動作します。 ありがとう@Chris Satchell – uday214125

+0

'!doc'を使用するとおそらく同様に動作します –

関連する問題