Але це не здається правильним способом зробити це ..
Це дійсно правильний спосіб зробити це (або , по крайней мере , на правильний спосіб зробити це). Це ключовий аспект обіцянок, вони є конвеєром, і дані можуть масажуватися різними обробниками конвеєру.
Приклад:
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
у першу чергу? Чому б просто не викинути помилку? Ще раз спасибі,