2016-09-24 126 views
16

我试图将两个异步函数链接在一起,因为第一个函数有一个条件返回参数,导致第二个参数运行或退出模块。但是,我发现了在规格中找不到的奇怪行为。在异步函数外使用await

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

这是我的代码片段bastardized(你可以看到完整的范围here),即只检查是否已经在大堂的球员,但是这无关紧要。

接下来我们有这个异步函数。

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

该功能不需要运行,如果exit === true

我试图做

const inLobby = await isInLobby(); 

此我希望将等待到的结果,所以我可以用inLobby有条件地运行countPlayer,但是我收到一个类型错误,没有具体细节。

为什么你不能在awaitasync函数的函数范围之外?我知道这是一个糖的承诺,所以它必须链接到then但为什么它在countPlayer我可以等待另一个承诺,但在外面,我不能awaitisInLobby

+0

您能告诉我们您在哪里*等待了isInLobby()',以及如何使用inLobby?另外,在哪里/如何调用'countPlayer'? – Bergi

+0

@Bergi我链接我的回购实际上下文。太多的代码放入问题 –

+0

我没有看到问题出在哪里(也许你已经更新了回购)?如果你引用了'isInLobby()。then(... countPlayer()。then ...')部分,那么解决方案就很简单了:只需要包含这些调用的函数('(req,res)=>') 'async'。 – Bergi

回答

26

顶级await不支持。标准委员会为什么会进行一些讨论,如this Github issue

还有一个thinkpiece on Github关于为什么最高级别等待是一个坏主意。具体他建议,如果你有这样的代码:

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

现在任何文件导入​​不会执行,直到获取完成,因此所有的模块加载的已被锁住。这使得很难推断应用程序模块的顺序,因为我们习惯于同步和可预测地执行顶级Javascript。如果这是允许的,知道函数何时被定义变得棘手。

+0

这是一个很好的链接,谢谢。这是一个耻辱的顶级支持不存在。我希望是。目前,我必须在这里嵌套我的承诺,这是非常糟糕的做法,我不喜欢它。 (谢谢) –

+0

@SterlingArcher或者使用异步IIFE:void异步函数(){const inLobby = await isInLobby()}()' – robertklep

+0

@robertklep不会将函数的作用域设置为'inLobby'可访问吗? –

16

总是有这门课程的:

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

这使得一个快速的功能与异步这里可以用等待。它可以节省您制作非常好的异步功能的需求! // credits Silve2611

+0

请进一步阐述并解释其原因 –

+2

这是非常愚蠢的解决方案这是一个使用异步的快速函数,您可以使用await,它可以节省您制作异步函数的必要性太棒了! – Silve2611

+3

由于您仍然需要“等待”这个匿名函数,所以它不能解决问题,而这个函数又不能从函数外部工作。 – Michael