async/await vs组合生成器和承诺?

Sha*_*awn 1 javascript generator promise async-await

MDN文档

async/await函数的目的是简化同步使用promises的行为,并对一组Promises执行某些行为.就像Promise类似于结构化回调一样,async/await类似于组合生成器和promise.

我理解async/await,generator和promise的基本概念.但是,我并不完全理解async/await类似于组合生成器和promise的含义.

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

Jef*_*amp 7

你是对的.首先使用生成器和promises的示例:

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
Run Code Online (Sandbox Code Playgroud)

这个生成器产生一个Promise外部世界,我们通过将它作为参数传递回生成器的值iterator.next,一旦该承诺结算,它就会返回到生成器中.

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

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

这就是它的全部内容.异步函数将暂停,直到await关键字结束前面的promise表达式,并且表达式将评估为promise 的自动解包 - 即其最终值.

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

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

虽然根据我的经验,这个例子似乎是发生器和异步函数最常见的用例,其中async/await肯定是更清洁的方法,但是生成器确实具有一些非常强大的功能,async/await没有相同的功能方式(但这是另一个话题).