JS обещаний: это обещание эквивалентно этой асинхронной / ожидающей версии? - PullRequest
0 голосов
/ 02 мая 2020

Если у меня есть следующий код

new Promise(res => res(1))
.then(val => console.log(val))

, это эквивалентно

let val = await new Promise(res => res(1))
console.log(val)

Я знаю, что одно отличие заключается в том, что мне нужно обернуть второй в асинхронном режиме c функция, но в противном случае они эквивалентны?

1 Ответ

0 голосов
/ 02 мая 2020

Поскольку ваше обещание всегда разрешается (никогда не отклоняется), оно эквивалентно. Вы также можете сделать:

Promise.resolve(1).then(val => console.log(val));

Имейте в виду, что главное отличие с await (кроме того, оно должно быть заключено в функцию async) - это то, что происходит, когда обещание отклоняется. Хотя ваш пример решен, но не отклонен, давайте посмотрим, как они выглядят, с фактической обработкой ошибок (которая всегда должна быть):

new Promise(res => res(1))
   .then(val => console.log(val))
   .catch(err => console.log(err));

И:

try {
    let val = await new Promise(res => res(1));
    console.log(val);
} catch(e) {
    console.log(err);
}

Или, если у вас не было попытки / улова, любые отклонения будут автоматически отправлены обещанию, которое автоматически возвращается функцией async. Это автоматическое c распространение ошибок (как синхронных исключений, так и асинхронных отклонений) очень полезно в функции async.

Это становится более очевидным, когда у вас есть несколько последовательных асинхронных операций:

const fsp = require('fs').promises;

async function someFunc() {
    let handle = await fsp.open("myFile.txt", "w");
    try {
         await handle.write(...);
         await handle.write(...);
    } finally {
        await handle.close().catch(err => console.log(err));
    }
}

someFunc().then(() => {
    console.log("all done");
}).catch(err => {
    console.log(err);
});

Здесь оболочка async отлавливает ошибки из любого из трех операторов await и автоматически возвращает их все вызывающей стороне. Оператор finally перехватывает одну из двух последних ошибок, чтобы закрыть дескриптор файла, но позволяет ошибке продолжать распространяться обратно к вызывающей стороне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...