循环收集异步和同步数据

时间:2016-10-14 10:41:55

标签: javascript node.js mongodb

    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'})    
  }

我想根据循环收集数据。 我知道如何处理nodejs中的异步调用。但我想按顺序回调。 例如虽然如果条件我想要循环,有一个异步调用,所以我可以在 dataSeq 中推送i的值,它将导致[1,2,3,4,5]数组。我想要那个序列,因为我的后期操作依赖于那个序列。

2 个答案:

答案 0 :(得分:0)

我认为asyncjs#eachSeries符合您的需求。

您的代码会变成这样:

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
});

答案 1 :(得分: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'})
})