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

时间:2017-09-04 19:41:17

标签: javascript promise async-await generator

MDN Docs

  

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

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

async / await简化了生成器和承诺可以一起做什么?任何一个例子?

1 个答案:

答案 0 :(得分:7)

是的,你是对的。首先使用生成器和承诺的示例:

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调用后传递回生成器的值,一旦该承诺结算。

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

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

这就是它的全部内容。异步函数将暂停,直到await关键字前面的promise表达式解析为止,表达式将计算为promise的自动 unwrap - 即其最终值。

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

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

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