【问题标题】:async/await vs combining generators and promises?异步/等待与结合生成器和承诺?
【发布时间】:2018-02-13 01:18:53
【问题描述】:

MDN Docs

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

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

所以 async/await 简化了生成器和 Promise 可以一起做的事情?有什么例子吗?

【问题讨论】:

  • 阅读 this article 以了解 promises、generators 和 async/await 之间的区别。
  • Generators 被用作 together with an intricate helper function 的黑客来做 async/await 现在所做的事情。我建议避免这种比较,但是,它应该被视为历史文物。我认为 MDN 需要好好编辑……

标签: javascript promise async-await generator


【解决方案1】:

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

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,每次产生的promise 解决。这就是async await 的用武之地:

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

仅此而已。异步函数将暂停,直到前面有 await 关键字的 Promise 表达式解析,并且该表达式将评估为 Promise 的自动 unwrap - 即它的最终值。

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

这本质上与上面的 sn-p 与生成器的行为相同。

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

【讨论】:

  • 我不同意最后添加的意见。生成器最常见的用例是生成无限迭代器和实现惰性求值查询。
  • 太好了,杰弗里,感谢您直言不讳。我在审查队列中偶然发现了这个感谢@PhiQuangPhuoc 的关注。
猜你喜欢
  • 1970-01-01
  • 2018-03-05
  • 2017-06-15
  • 1970-01-01
  • 1970-01-01
  • 2018-10-17
  • 2018-03-02
  • 2018-09-02
  • 1970-01-01
相关资源
最近更新 更多