Использование ожидания вне функции 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