在异步函数外使用await
我试图将两个异步函数链接在一起,因为第一个函数有一个条件返回参数,导致第二个参数运行或退出模块。但是,我发现了在规格中找不到的奇怪行为。在异步函数外使用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
,但是我收到一个类型错误,没有具体细节。
为什么你不能在await
和async
函数的函数范围之外?我知道这是一个糖的承诺,所以它必须链接到then
但为什么它在countPlayer
我可以等待另一个承诺,但在外面,我不能await
isInLobby
?
顶级await
不支持。标准委员会为什么会进行一些讨论,如this Github issue。
还有一个thinkpiece on Github关于为什么最高级别等待是一个坏主意。具体他建议,如果你有这样的代码:
// data.js
const data = await fetch('/data.json');
export default data;
现在任何文件导入不会执行,直到获取完成,因此所有的模块加载的已被锁住。这使得很难推断应用程序模块的顺序,因为我们习惯于同步和可预测地执行顶级Javascript。如果这是允许的,知道函数何时被定义变得棘手。
这是一个很好的链接,谢谢。这是一个耻辱的顶级支持不存在。我希望是。目前,我必须在这里嵌套我的承诺,这是非常糟糕的做法,我不喜欢它。 (谢谢) –
@SterlingArcher或者使用异步IIFE:void异步函数(){const inLobby = await isInLobby()}()' – robertklep
@robertklep不会将函数的作用域设置为'inLobby'可访问吗? –
您能告诉我们您在哪里*等待了isInLobby()',以及如何使用inLobby?另外,在哪里/如何调用'countPlayer'? – Bergi
@Bergi我链接我的回购实际上下文。太多的代码放入问题 –
我没有看到问题出在哪里(也许你已经更新了回购)?如果你引用了'isInLobby()。then(... countPlayer()。then ...')部分,那么解决方案就很简单了:只需要包含这些调用的函数('(req,res)=>') 'async'。 – Bergi