TL; DR
Використовуйте Promise.all
для викликів паралельних функцій, відповідь поводиться неправильно, коли виникає помилка.
Спочатку виконайте всі асинхронні дзвінки одразу та отримайте всі Promise
об'єкти. По-друге, використання await
на Promise
об'єктах. Таким чином, поки ви чекаєте, коли перший Promise
вирішить інші асинхронні дзвінки, все ще прогресує. Загалом, ви будете чекати лише тих самих довгих, як найповільніший асинхронний дзвінок. Наприклад:
// Begin first call and store promise without waiting
const someResult = someCall();
// Begin second call and store promise without waiting
const anotherResult = anotherCall();
// Now we await for both results, whose async processes have already been started
const finalResult = [await someResult, await anotherResult];
// At this point all calls have been resolved
// Now when accessing someResult| anotherResult,
// you will have a value instead of a promise
Приклад JSbin: http://jsbin.com/xerifanima/edit?js,console
Caveat: Не має значення, чи є await
дзвінки на одній лінії або на різних лініях, якщо перший await
виклик відбувається після всіх асинхронних дзвінків. Дивіться коментар JohnnyHK.
Оновлення: ця відповідь має різний час обробки помилок відповідно до відповіді @ bergi , вона НЕ викидає помилку під час виникнення помилки, але після виконання всіх обіцянок. Я порівнюю результат з порадою @ jonny:, [result1, result2] = Promise.all([async1(), async2()])
перевірте наступний фрагмент коду
const correctAsync500ms = () => {
return new Promise(resolve => {
setTimeout(resolve, 500, 'correct500msResult');
});
};
const correctAsync100ms = () => {
return new Promise(resolve => {
setTimeout(resolve, 100, 'correct100msResult');
});
};
const rejectAsync100ms = () => {
return new Promise((resolve, reject) => {
setTimeout(reject, 100, 'reject100msError');
});
};
const asyncInArray = async (fun1, fun2) => {
const label = 'test async functions in array';
try {
console.time(label);
const p1 = fun1();
const p2 = fun2();
const result = [await p1, await p2];
console.timeEnd(label);
} catch (e) {
console.error('error is', e);
console.timeEnd(label);
}
};
const asyncInPromiseAll = async (fun1, fun2) => {
const label = 'test async functions with Promise.all';
try {
console.time(label);
let [value1, value2] = await Promise.all([fun1(), fun2()]);
console.timeEnd(label);
} catch (e) {
console.error('error is', e);
console.timeEnd(label);
}
};
(async () => {
console.group('async functions without error');
console.log('async functions without error: start')
await asyncInArray(correctAsync500ms, correctAsync100ms);
await asyncInPromiseAll(correctAsync500ms, correctAsync100ms);
console.groupEnd();
console.group('async functions with error');
console.log('async functions with error: start')
await asyncInArray(correctAsync500ms, rejectAsync100ms);
await asyncInPromiseAll(correctAsync500ms, rejectAsync100ms);
console.groupEnd();
})();