2016-10-28 2 views
0

У меня есть массив элементов var arr = [1, 2, 3, 4, 5, 6, 7, 8]. Я хочу, чтобы каждый элемент, делал что-то, и брал другой. Я не хочу, чтобы материал делался параллельно.Узел Q - массив дескрипторов с Q

, например:

arr.forEach(function(d){ 
    //send 'd' through HTTP 
    //if send is success wait 1000 resend the same.  
}); 

Как я могу сделать это с Q?

ответ

1

Чтобы превратить массив элементов в последовательно обработанный массив обещаний, вы можете использовать reduce.

var Q = require('q'); 

var arr = [1, 2, 3, 4, 5, 6, 7, 8]; 

var lastPromise = arr.reduce(function(promise, item) { 
    return promise.then(function() { 
     return someFunc(item); 
    }); 
}, Q.resolve()) 


lastPromise.then(function() { 
    console.log('some message'); 
}) 
.catch(function(error) { 
    console.log('some error'); 
}); 

Здесь someFunc обрабатывает ваша деталь сказать, как это

var item = 'item1'; 

someFunc(item).then(function(result) { 
     console.log("The task finished."); 
}) 
.catch(function(error) { 
     console.log(error); 
}); 

arr.reduce() принимает два аргумента, обратных вызов и начальный value.If вы заметите, что они прошли второй аргумент reduce(), теперь будет называть данный обратный вызов для каждого элемента в вашем массиве. Обратный вызов получает два аргумента. В первый раз первым аргументом является начальное значение, а второй аргумент - первый элемент массива. В следующий раз первым аргументом является возвращаемое значение предыдущего времени, когда был вызван обратный вызов, а второй аргумент - следующий элемент массива.

Для получения более подробной информации по этому вопросу, пожалуйста, посмотрите на https://joost.vunderink.net/blog/2014/12/15/processing-an-array-of-promises-sequentially-in-node-js

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

  • Нет связанных вопросов^_^