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

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

为什么不能在函数范围之外对await函数进行async?我知道这是一个糖 promise ,因此必须将其链接到then,但是为什么在countPlayer中我可以等待另一个 promise ,但是在外面,我不能await isInLobby呢?

最佳答案

不支持顶级await。标准委员会对此进行了一些讨论,例如this Github issue

还有一个thinkpiece on Github关于为什么等待顶级等待不是一个好主意。他特别建议,如果您有这样的代码:

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

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

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

关于javascript - 在异步函数外使用await,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39679505/

10-09 16:19
查看更多