当前位置: 首页 > 面试题库 >

在异步函数外使用await

葛嘉悦
2023-03-14
问题内容

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

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呢?


问题答案:

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

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

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

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

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



 类似资料:
  • 问题内容: 有没有办法使javascript 关键字在函数外部起作用?我希望能够冻结整个调用堆栈(而不是仅冻结函数的其余部分),以便在特定的Promise返回值后可以恢复。令人遗憾的是,目前尚未确定或尚未实施类似这样的强大功能。我试图使nodent.js正常工作,但是由于我的自定义加载程序和动态功能,不幸的是不切实际。 问题答案: 如果您正在寻找黑客,而不是适当的基于诺言的并发解决方案,请看一下节

  • 问题内容: 我想要实现的是Web钩子应该等待,直到我从api调用获得响应为止。PS:API正在起作用,只是机器人不等待响应到来。任何帮助将不胜感激。谢谢 问题答案: 您没有说明要在什么环境中运行,但是鉴于您的代码以及上面概述的更改,我可以使用Firebase Cloud Functions和node.js 6.14复制您的问题。 我可以通过使用包而不是来使它正常工作。顾名思义,它使用本机Promi

  • 我有一个异步函数,它在代码中的某个地方按setInterval运行。此函数定期更新一些缓存。 我还有一个不同的同步函数,它需要检索值——最好是从缓存中检索,但如果是缓存未命中,则从数据源检索(我意识到以同步方式进行IO操作是不明智的,但假设在这种情况下需要这样做)。 我的问题是,我希望同步函数能够等待异步函数中的值,但是不可能在非异步函数中使用关键字: 现在,通过将中的逻辑提取到一个新的同步函数中

  • 问题内容: 如何从异步函数返回值?我试图喜欢这个 它给了我, 问题答案: 您不能超出范围。为了获得预期的结果,您应该将其包装到异步IIFE中,即 样品。 有关更多信息 由于返回一个Promise,因此可以将其省略,如下所示: 然后像以前一样做

  • 问题内容: 我想使用生成器yield和async函数。我阅读了本主题,并编写了以下代码: 但是我得到了错误: 语法错误:异步函数中的“ yield” 如何在异步功能中使用良率生成器? 问题答案: 更新: 从Python 3.6开始,我们有了异步生成器,能够直接在协程内部使用。 Python 3.5的旧答案: 您不能在协程内部。唯一的方法是使用/ magic方法手动实现异步迭代器。在您的情况下: 输

  • 我在一个函数中有这样的代码块: 它获取一些数据,然后对数据运行验证()。 但是,我对数据的验证实际上也是异步的,因为它是根据一个json模式来验证数据的,而json模式位于一个独立的json文件中,所以它必须首先读取该文件。 我使用了一个承诺来读取文件内容,然后进行验证: 如何编辑此问题中的顶部代码块以解释if语句()中的异步函数?