Promise.reduce
Promise.reduce(
Iterable<any>|Promise<Iterable<any>> input,
function(any accumulator, any item, int index, int length) reducer,
[any initialValue]
) -> Promise
Дано Iterable(массивы являются Iterable), или обещание Iterable, которое генерирует обещания (или смесь обещаний и значений), перебирайте все значения в Iterable в массив и сводите массив к значению с использованием заданной reducer функции.
Если функция-редуктор возвращает обещание, то результат обещания ожидает исполнения перед продолжением следующей итерации. Если какое-либо обещание в массиве отклоняется или обещание, возвращаемое функцией-редуктором, отклоняется, то результат также отклоняется.
Последовательно считывайте заданные файлы, суммируя их содержимое как целое число. Каждый файл содержит только текст 10.
Promise.reduce(["file1.txt", "file2.txt", "file3.txt"], function(total, fileName) {
return fs.readFileAsync(fileName, "utf8").then(function(contents) {
return total + parseInt(contents, 10);
});
}, 0).then(function(total) {
//Total is 30
});
Если initialValue равно undefined (или обещанию, которое разрешается в undefined) и итерируемый объект содержит только 1 элемент, обратный вызов не будет вызван, и единственный элемент итерируемого объекта будет возвращён. Если итерируемый объект пуст, обратный вызов не будет вызван и будет возвращено initialValue (что может быть undefined).
Promise.reduce начнёт вызывать редуктор как можно быстрее, поэтому вы можете использовать его вместо Promise.all (которое ожидает весь массив, прежде чем вы сможете вызвать Array#reduce на нём).
© 2013–2018 Petka Antonov
Licensed under the MIT License.
http://bluebirdjs.com/docs/api/promise.reduce.html