Поскольку ваше обещание всегда разрешается (никогда не отклоняется), оно эквивалентно. Вы также можете сделать:
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
перехватывает одну из двух последних ошибок, чтобы закрыть дескриптор файла, но позволяет ошибке продолжать распространяться обратно к вызывающей стороне.