2016-10-14 2 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'})  
    } 

Я хочу собирать данные в соответствии с циклами excecutes. Мне известно, как обращаться с асинхронными вызовами в nodejs. Но я хочу, чтобы обратные вызовы были последовательно. , например. Хотя есть асинхронный вызов в том случае, если условие я хочу, чтобы занять цикл, так что я могу нажать значение i в dataSeq, и это приведет к [1,2,3,4,5] массиву. Я хочу эту последовательность, потому что мои пост-операции зависят от этой последовательности.Сбор асинхронных и синхронных данных в петле

+0

Почему вы используете store.findOne Вы даже does't использовать данные обратного вызова?. –

ответ

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

Смежные вопросы