Использование ожидания вне функции async
Я пытался связать две асинхронные функции вместе, потому что первый имел параметр условного возврата, который заставлял второй либо запускаться, либо выходить из модуля. Тем не менее, я нашел странное поведение, которое я не могу найти в спецификациях.
async function isInLobby() {
//promise.all([chained methods here])
let exit = false;
if (someCondition) exit = true;
}
Это укороченный фрагмент моего кода (вы можете увидеть полный объем здесь), который просто проверяет, если игрок, если он уже находится в лобби, но это не имеет значения.
Затем мы получаем эту асинхронную функцию.
async function countPlayer() {
const keyLength = await scardAsync(game);
return keyLength;
}
Эта функция не требуется запускать, если exit === true
.
Я пытался сделать
const inLobby = await isInLobby();
Я надеялся, что ожидаю результатов, поэтому я могу использовать inLobby
для условного запуска countPlayer
, однако я получил typeerror без особых сведений.
Почему вы не можете await
a async
за пределами области действия? Я знаю, что это обещание сахара, поэтому оно должно быть привязано к then
, но почему в countPlayer
я могу ждать другого обещания, но на улице я не могу await
isInLobby
?
Ответы
Ответ 1
Верхний уровень await
не поддерживается. Есть несколько дискуссий в комитете по стандартам о том, почему это так, например этот вопрос Github.
Там также мыслитель на Github о том, почему высокий уровень ожидания - плохая идея. В частности, он предполагает, что если у вас есть такой код:
// data.js
const data = await fetch( '/data.json' );
export default data;
Теперь любой файл, который импортирует data.js
, не будет выполняться до тех пор, пока выборка не завершится, поэтому вся загрузка вашего модуля теперь заблокирована. Это очень затрудняет рассуждение о порядке модуля приложения, поскольку мы привыкли к выполнению Javascript верхнего уровня, выполняющегося синхронно и предсказуемо. Если это было разрешено, зная, когда функция определяется, становится сложной.
Ответ 2
Конечно, всегда есть:
(async () => {
await ...
})();
Это делает быструю функцию с async, где вы можете использовать ожидание. Это избавляет вас от необходимости делать асинхронную функцию, которая великолепна!//кредиты Silve2611