当前位置: 首页 > 知识库问答 >
问题:

异步/等待vs组合生成器和promise?

施永贞
2023-03-14

MDN文档

异步/等待函数的目的是简化同步使用promise的行为,并对一组promise执行某些行为。正如promise类似于结构化回调一样,async/await类似于组合生成器和promise。

我了解异步/等待、生成器和promise的基本概念。然而,我不完全理解说async/await类似于将生成器和promise结合起来意味着什么。

所以async/wait简化了生成器和promise可以一起做什么?有什么例子吗?

共有1个答案

赏星河
2023-03-14

是的,你说得对。先举一个发电机的例子,并promise:

function *gen () {
    const promiseValue = yield new Promise((resolve) => resolve(42));
    console.log(promiseValue);
}

// .. and at some other context using '*gen'

const iterator = gen();
const { value: promise } = iterator.next(); // Promise (42)

promise.then((resolvedValue) => iterator.next(resolvedValue)); // logs 42

这个生成器向外部世界产生一个promise,我们通过将其作为参数传递给迭代器,将其值传递回生成器。下一个打电话,一旦promise达成。

这种模式至少与所谓的任务相交。这样做的缺点是,每次产生的promise解析时,我们都必须在迭代器上手动调用Next。这就是异步等待的地方:

async function task() {
    const promiseValue = await new Promise((resolve) => resolve(42));
    console.log(promiseValue);
}

这就是全部。异步函数将暂停,直到前面有wait关键字的promise表达式解析,表达式将计算为promise的自动展开,即其最终值。

然后等待表达式的结果(42,在我们的例子中)将被分配给promiseValue,就像yield一样。这一切都发生在函数继续执行下一条语句之前。

这与上面的代码片段和生成器的行为基本相同。

虽然根据我的经验,这个例子似乎是生成器和异步函数最常见的用例,其中async/await绝对是更干净的方法,但是生成器确实有一些async/await没有的强大功能(但这是另一个主题)。

 类似资料:
  • 我通读了Dart/flatter中的Async/Await/then,试图理解为什么aysnc函数中的Await不会等到完成后再继续。在我的UI中,有一个按钮调用一个异步方法来返回一个位置,该位置总是返回null,并且不等待函数完成。 该函数将调用推送到一个新的UI页面,该页面选择一个位置,并应返回一个结果。如何使该函数等待结果?我不是在使用异步吗?

  • 问题内容: 我正在尝试使用新的异步功能,希望解决我的问题以后能对其他人有所帮助。这是我的代码正在工作: 问题是,我的while循环运行得太快,脚本每秒向Google API发送太多请求。因此,我想构建一个睡眠函数以延迟请求。因此,我也可以使用此功能来延迟其他请求。如果还有其他方法可以延迟请求,请告诉我。 无论如何,这是我的新代码不起作用。请求的响应在setTimeout中返回给匿名异步函数,但是我

  • 问题内容: 承诺和生成器允许您编写异步代码。我不明白为什么在ECMA脚本6中同时引入了这两种机制。什么时候最好使用Promise?什么时候使用生成器? 问题答案: 这两种技术之间没有对立。它们共存并很好地互补。承诺使您能够获得尚不可用的异步操作的结果。它解决了厄运金字塔问题。所以代替: 你可以写: 但是即使有承诺,您也必须以异步方式编写代码- 您必须始终将回调传递给函数。编写异步代码比同步代码难得

  • 我试图在react/electron项目中使用async/await,但它不起作用。我想要的是获取docker容器状态列表。但是安慰。日志(列表)返回未定义的。 有人能帮我吗?:)

  • 在实际应用中,我对 C# 中的异步和 await 方法进行了说明。请考虑以程,这是工作代码的简单版本: 助手.cs 功能控制器.cs processing.js 现在,问题是第三方服务的所需时间更少(例如:2秒),而所需的时间更多(例如:100秒)。进行两个ajax调用并使用异步和等待是为了呈现自我。屏幕上显示数据1,不要等到自己。Data2已被检索。不幸的是,这种情况没有发生,我必须等待100秒

  • 我正在尝试将数据库调用移出控制器,以清理并使其可测试。当它们在控制器中时,一切都会顺利进行。我将它们移出控制器,并添加了一个异步,以确保我们等待。否则,我将调用的中的函数。现在,一旦我使用async/await,控制器中的函数就会认为没有用户,因为它没有等待。 有几个关于异步等待的SO问题,但我没有找到一个解决我的问题。我确实验证了返回了我的用户,并添加了控制台日志来显示路径。 节点猫鼬异步等待似