Как получить результат обещания позднее? В тесте я получаю письмо перед отправкой дальнейших запросов:
const email = await get_email();
assert.equal(email.subject, 'foobar');
await send_request1();
await send_request2();
Как я могу отправлять запросы во время медленного поиска электронной почты?
Сначала я подумала дождаться письма позже:
// This code is wrong - do not copy!
const email_promise = get_email();
await send_request1();
await send_request2();
const email = await email_promise;
assert.equal(email.subject, 'foobar');
Это работает, если get_email()
успешен, но терпит неудачу, если get_email()
завершается неудачно до соответствующего await
, с полностью оправданным UnhandledPromiseRejectionWarning
.
Конечно, я мог бы использовать Promise.all
, вот так:
await Promise.all([
async () => {
const email = await get_email();
assert.equal(email.subject, 'foobar');
},
async () => {
await send_request1();
await send_request2();
},
]);
Тем не менее, это делает код намного труднее для чтения (это больше похоже на программирование на основе обратного вызова), особенно если последующие запросы фактически зависят от электронной почты, или происходит некоторое вложение. Можно ли сохранить результат/исключение для обещания и await
его позже?
Если нужно, вот тестовый пример с ложными срабатываниями, которые иногда терпят неудачу, а иногда работают, со случайным временем Он никогда не должен выводить UnhandledPromiseRejectionWarning
.