Но это не похоже на правильный способ сделать это ...
Это действительно правильный способ сделать это (или , по крайней мере , на правильный способ сделать это). Это ключевой аспект обещаний, они конвейер, и данные могут обрабатываться различными обработчиками в конвейере.
Пример:
const promises = [
new Promise(resolve => setTimeout(resolve, 0, 1)),
new Promise(resolve => setTimeout(resolve, 0, 2))
];
Promise.all(promises)
.then(data => {
console.log("First handler", data);
return data.map(entry => entry * 10);
})
.then(data => {
console.log("Second handler", data);
});
( catch
обработчик опущен для краткости. В рабочем коде всегда либо распространяйте обещание, либо обрабатывайте отклонение.)
Результат, который мы видим из этого:
Первый обработчик [1,2]
Второй обработчик [10,20]
... потому что первый обработчик получает разрешение двух обещаний ( 1
и 2
) в виде массива, а затем создает новый массив с каждым из них, умноженным на 10, и возвращает его. Второй обработчик получает то, что вернул первый обработчик.
Если дополнительная работа, которую вы выполняете, синхронна, вы также можете поместить ее в первый обработчик:
Пример:
const promises = [
new Promise(resolve => setTimeout(resolve, 0, 1)),
new Promise(resolve => setTimeout(resolve, 0, 2))
];
Promise.all(promises)
.then(data => {
console.log("Initial data", data);
data = data.map(entry => entry * 10);
console.log("Updated data", data);
return data;
});
... но если он асинхронный, вы не захотите этого делать, так как в конечном итоге оно становится вложенным, и вложение может быстро выйти из-под контроля.
reject
значение после начальнойPromise
функции? Или сообщение об ошибке в любом месте цепочки приведет вас к.catch()
? Если это так, то в чем вообще смыслreject
? Почему бы просто не выдать ошибку? Еще раз спасибо,