繁体   English   中英

异步/等待与结合发电机和承诺?

[英]async/await vs combining generators and promises?

MDN文件

异步/等待功能的目的是简化同步使用Promise的行为,并对一组Promises执行某些行为。 就像Promises类似于结构化回调一样,异步/等待类似于组合生成器和Promise。

我了解异步/等待,生成器和承诺的基本概念。 但是,我不完全理解说async / await类似于组合生成器和Promise意味着什么

那么异步/等待简化了生成器和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 ,一旦诺言解决,我们便通过将其值传递给iterator.next调用的参数,将其值传递回生成iterator.next

这种模式至少与所谓的任务相交。 这样做的缺点是,每次产生承诺时,我们都必须在迭代器上手动调用next 那就是async await的地方:

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

这就是全部。 异步函数将暂停,直到由await关键字开头的promise表达式解析为止,并且该表达式将求值以自动解开promise-即其最终值。

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

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

尽管以我的经验来看,此示例似乎是生成器和异步函数的最常见用例,但在这种情况下,异步/等待绝对是更清洁的方法,但生成器确实具有异步/等待所没有的强大功能。方式(但这是另一个主题)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM