2016-10-14 9 views
1
var data = [10,21,33,40,50,69]; 
    var i = 0;   
    var dataSeq = []; 
    while(i<data.length){     
     if(data[i]%2 == 0){      
      store.findOne({'visibility': true},function(err, data){        
      dataSeq.push(i) 
      i++;        
      });       
     } 
     else{ 
     dataSeq.push(i) 
     i++;       
     } 
    } 
    if(i==data.length-1){ 
    console.log(dataSeq) // Should Print [1,2,3,4,5] 
    return res.status(200).send({ message: 'Task Completed'})  
    } 

ループごとにデータを収集する必要があります。 nodejで非同期呼び出しを処理する方法を知っています。しかし、私は順番にコールバックが欲しいです。例: 私がループを止めたいと思っている場合には、非同期呼び出しがありますので、dataSeqにiの値をプッシュすると[1,2,3,4,5]配列になります。私のポスト操作はそのシーケンスに依存しているので、そのシーケンスが必要です。ループ内の非同期データおよび同期データを収集する

+0

のようなものを使用することができます。

あなたのコードは次のようになります。 –

答えて

0

私はあなたが必要としているものはasyncjs#eachSeriesだと思います。 ?あなたはstore.findOneを使用しているなぜあなたも、コールバックからdoes't使用データを

async.each(data, (item, callback) => { 
    if(item%2 == 0){      
      store.findOne({'visibility': true},function(err, data){        
      dataSeq.push(i) 
      i++;        
      });       
     } 
     else{ 
     dataSeq.push(i) 
     i++;       
     } 
}, (err) => { 
    // if any of the callbacks produced an error, err would equal that error 
}); 
0

あなたはasync#eachOf

var async = require('async'); 

var data = [10,21,33,40,50,69]; 
var dataSeq = []; 

async.eachOf(data, function(value, key, cb) { 
    if (value % 2 == 0) { 
     store.findOne({ 'visibility': true }) 
     .then(function(doc) { 
      dataSeq.push(key); 
     }) 
     .catch(function(err) { 
      return cb(err); 
     }); 
    } else { 
     cb(); 
    } 
}, function(err) { 
    if (err) { 
     console.error(err) 
     return res.status(500).send(); # handle the error as you want 
    } 
    return res.status(200).send({ message: 'Task Completed'}) 
}) 
+0

eachOfは私が知る限り、まだ並行して動いています。彼はシリーズでそれを望んでいると言いました。つまり、サンプルコードがシーケンシャル操作に依存していないように、彼は本当に必要なものを求めていない可能性があります。 – Paul

関連する問題