Promise.each
Promise.each(
Iterable<any>|Promise<Iterable<any>> input,
function(any value, int index, int arrayLength) iterator
) -> Promise<Array<any>>
Принимая на вход итерируемый объект (например, массив) или промис содержащий такой объект, выполняет последовательную итерацию по всем значениям, вызывая заданную функцию для каждого элемента. Если элемент является промисом, итерация будет ждать его разрешения перед продолжением. Функция-итератор имеет вид (value, index, arrayLength) , где value — текущий элемент (или его разрешенное значение, если это промис).
Если на какой-либо итерации:
Функция-итератор возвращает промис или объект с методом then, то выполнение будет ожидать его разрешения перед переходом к следующей итерации.
Текущий элемент итерации — неразрешенный промис, итерация будет ожидать разрешения этого промиса перед вызовом функции-итератора.
Текущий элемент итерации — отклоненный промис, итерация будет остановлена и также будет отклонена (с той же причиной).
Если все итерации успешно разрешаются, вызов Promise.each возвращает новый массив, содержащий разрешенные значения исходных элементов.
Promise.each очень похож на Promise.mapSeries. Разница между Promise.each и Promise.mapSeries заключается в значении результата. Promise.each возвращает массив, как описано выше, в то время как Promise.mapSeries возвращает массив, содержащий результаты функции-итератора на каждой итерации. Таким образом, Promise.each в основном предназначен для операций с побочными эффектами (так как результаты итератора по существу игнорируются), как и родной метод .forEach() массивов, в то время как Promise.map предназначен для использования как асинхронной версии родного метода .map() массивов.
Базовый пример:
// The array to be iterated over can be a mix of values and promises.
var fileNames = ["1.txt", Promise.resolve("2.txt"), "3.txt", Promise.delay(3000, "4.txt"), "5.txt"];
Promise.each(fileNames, function(fileName, index, arrayLength) {
// The iteration will be performed sequentially, awaiting for any
// promises in the process.
return fs.readFileAsync(fileName).then(function(fileContents) {
// ...
// The final resolution value of the iterator is is irrelevant,
// since the result of the `Promise.each` has nothing to do with
// the outputs of the iterator.
return "anything"; // Doesn't matter
});
}).then(function(result) {
// This will run after the last step is done
console.log("Done!")
console.log(result); // ["1.txt", "2.txt", "3.txt", "4.txt", "5.txt"]
});
Пример с отклоненным промисом в массиве:
// If one of the promises in the original array rejects,
// the iteration will stop once it reaches it
var items = ["A", Promise.delay(8000, "B"), Promise.reject("C"), "D"];
Promise.each(items, function(item) {
return Promise.delay(4000).then(function() {
console.log("On iterator: " + item);
});
}).then(function(result) {
// This not run
}).catch(function(rejection) {
console.log("Catch: " + rejection);
});
// The code above outputs the following after 12 seconds (not 16!):
// On iterator: A
// On iterator: B
// Catch: C
© 2013–2018 Petka Antonov
Licensed under the MIT License.
http://bluebirdjs.com/docs/api/promise.each.html