Приоритет оператора между ожидающим и троичным

1

Я попробовал это с консолью Chrome:

const foo = async () => 1;
const bar = async () => 2;
(await 1) ? foo() : bar();

Результат: 1.

Вы можете объяснить это, пожалуйста? Разве он не должен возвращать обещание?

  • 1
    Какая версия Chrome, когда я пытаюсь var x = (await 1) ? foo() : bar(); Я получаю обещание в х, как и ожидалось.
  • 0
    Интересно. Когда я пробую вашу операцию, я также получаю х в качестве Обещания. Но без присваивания возвращается 1.
Показать ещё 2 комментария
Теги:
async-await
ternary

3 ответа

1
Лучший ответ

Кажется, хром-консоль сделала что-то под капотом, что не вызывает беспокойства по этому вопросу. Результат операции такой, как ожидалось.

Изображение 174551

Благодаря Paulpro

  • 1
    Хромированная консоль нарушает стандарты "под капотом"! Код должен выдавать синтаксическую ошибку, потому что await распознается только как оператор внутри асинхронной функции.
  • 1
    @ traktor53 Они добавили, что это довольно недавний выпуск: developers.google.com/web/updates/2017/08/… . Обратите внимание, что REPL не претендует на запуск в глобальной области видимости, поэтому его можно легко проверить в асинхронной функции.
1

await принуждает, не обещание операнды обещания путем вызова Promise.resolve(operand). Так

 (await 1)

становится

 (await Promise.resolve(1))

и Promise.resolve(1) возвращает обещание, выполненное со значением 1.

После ожидания ожидания (асинхронно - после выполнения задания в очереди задания обещания *) трехмерное выражение оценивается как

 1 ? foo() : bar()  // calls foo()

Приоритет оператора await выглядит таким же, как и у других унарных операторов.

* Примечание await никогда не будет выполняться в том же вызове из цикла событий, даже если обещание, которое оно ожидает, уже выполнено: оно всегда возвращается в другой вызов из цикла событий.

  • 0
    Я пропустил ключевое слово async на foo и bar, когда создал вопрос. Уже обновил его. Извините за путаницу. Возвращение foo() - это обещание.
0

Ожидание ожидает async-функции в качестве аргумента и приостанавливает операцию до тех пор, пока не будет возвращено обещание в функции async. В вашем случае 1 является выражением, и, следовательно, оно возвращается немедленно. Теперь ваш тернарный оператор принимает 1 как выражение, которое истинно в логике JavaScript. Это вызовет вашу первую функцию, то есть foo. Таким образом, ваш результат будет 1

Ещё вопросы

Сообщество Overcoder
Наверх
Меню