异步/等待与组合生成器和承诺?



MDN Docs

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

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

所以异步/等待简化了生成器和承诺可以一起做什么?有什么例子吗?

是的,你是对的。一个带有生成器的示例,并首先承诺:

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调用来将其值传递回生成器。

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

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

仅此而已。异步函数将暂停,直到await关键字前面的 promise 表达式解析,并且表达式的计算结果将自动解包promise - 即其最终值。

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

这本质上与上述代码片段与生成器的行为相同。

尽管根据我的经验,此示例似乎是生成器和异步函数最常见的用例,其中 async/await 绝对是更干净的方法,生成器确实具有一些非常强大的功能,而 async/await 没有以相同的方式(但这是另一个主题)。

最新更新