一尘不染

在异步函数外使用await

node.js

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

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,但是我收到了没有具体细节的类型错误。

为什么您不能awaitasync功能超出功能范围?我知道这是一个糖承诺,因此必须将其链接到其中,then但是为什么在countPlayer我可以等待另一个诺言的同时却在外面却不能await
isInLobby呢?


阅读 429

收藏
2020-07-07

共1个答案

一尘不染

await不支持顶层。标准委员会对此进行了一些讨论,例如有关Github的问题

在Github上也有一篇关于为什么等待顶级等待的想法不好的想法。他特别建议如果您具有以下代码:

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

现在, 所有
导入文件data.js都不会执行,直到提取完成,因此所有模块加载现在都被阻止。由于我们习惯于以同步且可预测的方式执行顶级Javascript,因此很难对应用程序模块的顺序进行推理。如果允许这样做,那么知道何时定义函数将变得很棘手。

我的观点
是,仅通过加载模块来产生副作用是不好的做法。这意味着您的模块的任何使用者都将仅通过需要您的模块即可获得副作用。这严重限制了模块的使用位置。顶层await可能意味着您正在读取一些API或在
加载时 调用某些服务 相反,您应该仅导出供消费者按自己的节奏使用的异步函数。

2020-07-07