Синтаксис оператора await
:
await UnaryExpression
Это означает, что выражение целиком будет оцениваться перед передачей в await
. Вот разбивка того, что происходит, когда await funcName(arg)[0]
funcName(arg)
возвращает обещание.
[0]
- квадрат в скобках использовано обозначение на обещании . Итак, он получает свойство 0
из объекта обещания.
Так как такого свойства нет, результатом выражения будет undefined
.
await
вызывается на undefined
. Поскольку это не обещание, оно обрабатывается как Promise.resolve(undefined)
, и поэтому ждать нечего.
Выполнение кода продолжается до фактического объекта обещания с шага 1. завершено.
Вы можете заставить await
учитывать возвращенное обещание, если вы заключите правильную часть выражения в скобки или используете его только в выражение, возвращающее обещание:
const simpleAsync = async function () {
return ["one", "two"];
}
async function main() {
const foo = await simpleAsync()[0];
const bar = (await simpleAsync())[0];
// ^ ^
const baz = await simpleAsync();
console.log("foo:", foo);
console.log("bar:", bar);
console.log("baz:", baz);
}
main();
Однако, если вы хотите напрямую получить оба возвращаемых значения, вы можете просто использовать деструктуризацию для множественного присваивания :
const simpleAsync = async function () {
return ["one", "two"];
}
async function main() {
const [a, b] = await simpleAsync();
console.log("a:", a);
console.log("b:", b);
}
main();
Таким образом, await
вызывается с фактическим обещанием, а не без обещания, и после , которое разрешено, a
и Будет присвоено b
переменных.