2016-09-24 3 views
16

Я пытался связать две функции асинхронного взаимодействия, потому что первый имел условный параметр возврата, который заставлял второй запускать или выходить из модуля. Тем не менее, я нашел странное поведение, которое я не могу найти в спецификациях.Использование await вне функции async

async function isInLobby() { 
    //promise.all([chained methods here]) 
    let exit = false; 
    if (someCondition) exit = true; 
} 

Это извращается фрагмент моего кода (вы можете увидеть в полном объеме here), который просто проверяет, если ли уже в вестибюле игрок, но это не имеет значения.

Далее у нас есть эта функция асинхронизации.

async function countPlayer() { 
    const keyLength = await scardAsync(game); 
    return keyLength; 
} 

Эта функция не должна запускаться, если exit === true.

Я пытался сделать

const inLobby = await isInLobby(); 

В этом я надеялся, что будет ждать до результатов, так что я могу использовать inLobby условно запустить countPlayer, однако я получил TypeError без каких-либо конкретных деталей.

Почему вы не можете await a async функция вне сферы действия функции? Я знаю, что это обещание сахара, поэтому его нужно приковать к then, но почему это так: countPlayer Я могу ждать другого обещания, но на улице я не могу awaitisInLobby?

+0

Можете ли вы показать нам, где * вы ждали isInLobby() 'и как используется' inLobby'? Кроме того, где/как называется 'countPlayer'? – Bergi

+0

@Bergi Я связал свое репо для фактического контекста. Слишком много кода, чтобы поставить в вопрос –

+0

Я не вижу, где проблема с этим (возможно, вы уже обновили репо)? Если вы ссылаетесь на 'isInLobby(), тогда (... countPlayer(). Then ...' part, решение тривиально: просто создайте функцию, в которой содержатся эти вызовы ('(req, res) =>' one) 'async'. – Bergi

ответ

26

Верхний уровень await не поддерживается. Есть несколько дискуссий со стороны комитета по стандартам о том, почему это так, например, this Github issue.

Существует также thinkpiece on Github о том, почему высокий уровень ожидания - плохая идея. В частности, он предполагает, что если у вас есть такой код:

// data.js 
const data = await fetch('/data.json'); 
export default data; 

Теперь любой файл, который импортирует data.js не выполнять до тех пор, пока не завершится выборки, поэтому все ваши загрузки модуля теперь заблокирован. Это очень затрудняет рассуждение о порядке модуля приложения, поскольку мы привыкли к выполнению Javascript верхнего уровня, выполняющегося синхронно и предсказуемо. Если это было разрешено, зная, когда функция определяется, становится сложной.

+0

Это хорошая ссылка, спасибо. Это позорный уровень поддержки сверху не существует. Надеюсь, это так. В настоящее время, поскольку он стоит, я должен сложить свои обещания здесь, и это очень плохая практика, и мне это не нравится. :(Спасибо. –

+0

@SterlingArcher альтернативно, используйте async IIFE: 'void async function() {const inLobby = await isInLobby()}()' – robertklep

+0

@robertklep не будет использовать эту область 'inLobby' для функции, -accessible? –

16

Существует всегда это конечно:

(async() => { 
    await ... 
})(); 

Это делает быструю функцию с асинхронным, где вы можете использовать поджидают. Это избавляет вас от необходимости делать асинхронную функцию, которая великолепна! // credits Silve2611

+0

Просьба пояснить, почему это работает. –

+2

Это очень глупо, чтобы опробовать этот ответ. Он выполняет быструю функцию с помощью async, где вы можете использовать ожидание. Это избавляет вас от необходимости делать асинхронную функцию, которая отлично! – Silve2611

+3

Не решает проблему, так как вам еще нужно «подождать» эту анонимную функцию, которая опять же не работает извне функций. – Michael

Смежные вопросы