Но это не похоже на правильный способ сделать это ...
Это действительно правильный способ сделать это (или , по крайней мере , на правильный способ сделать это). Это ключевой аспект обещаний, они конвейер, и данные могут обрабатываться различными обработчиками в конвейере.
Пример:
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
? Почему бы просто не выдать ошибку? Еще раз спасибо,resolve
иreject
. Когда вы обрабатываете , если ваша обработка терпит неудачу, вы действительно генерируете исключение, чтобы запустить путь отказа. И да, вы также можете генерировать исключение из исходногоPromise
обратного вызова (вместо использованияreject
), но не все сбои являются исключениями.Ваш
return data
подход правильный, это пример цепочки обещаний . Если вы вернете обещание из своего.then()
обратного вызова, JavaScript разрешит это обещание и передаст данные следующемуthen()
обратному вызову.Просто будьте осторожны и убедитесь, что вы обрабатываете ошибки с помощью
.catch()
.Promise.all()
отклоняет, как только одно из обещаний в массиве отклоняется .источник
Сегодня NodeJS поддерживает новый
async/await
синтаксис. Это простой синтаксис, который значительно облегчает жизньasync function process(promises) { // must be an async function let x = await Promise.all(promises); // now x will be an array x = x.map( tmp => tmp * 10); // proccessing the data. } const promises = [ new Promise(resolve => setTimeout(resolve, 0, 1)), new Promise(resolve => setTimeout(resolve, 0, 2)) ]; process(promises)
Учить больше:
источник