Я попробовал это с консолью Chrome:
const foo = async () => 1;
const bar = async () => 2;
(await 1) ? foo() : bar();
Результат: 1.
Вы можете объяснить это, пожалуйста? Разве он не должен возвращать обещание?
Кажется, хром-консоль сделала что-то под капотом, что не вызывает беспокойства по этому вопросу. Результат операции такой, как ожидалось.
Благодаря Paulpro
await
распознается только как оператор внутри асинхронной функции.
await
принуждает, не обещание операнды обещания путем вызова Promise.resolve(operand)
. Так
(await 1)
становится
(await Promise.resolve(1))
и Promise.resolve(1)
возвращает обещание, выполненное со значением 1.
После ожидания ожидания (асинхронно - после выполнения задания в очереди задания обещания *) трехмерное выражение оценивается как
1 ? foo() : bar() // calls foo()
Приоритет оператора await
выглядит таким же, как и у других унарных операторов.
* Примечание await
никогда не будет выполняться в том же вызове из цикла событий, даже если обещание, которое оно ожидает, уже выполнено: оно всегда возвращается в другой вызов из цикла событий.
foo()
- это обещание.
Ожидание ожидает async-функции в качестве аргумента и приостанавливает операцию до тех пор, пока не будет возвращено обещание в функции async. В вашем случае 1 является выражением, и, следовательно, оно возвращается немедленно. Теперь ваш тернарный оператор принимает 1 как выражение, которое истинно в логике JavaScript. Это вызовет вашу первую функцию, то есть foo. Таким образом, ваш результат будет 1
var x = (await 1) ? foo() : bar();
Я получаю обещание в х, как и ожидалось.