【问题标题】:ES2017 Async/await functions - do they work only with promises?ES2017 Async/await 函数 - 它们是否仅适用于 Promise?
【发布时间】:2015-09-26 11:21:05
【问题描述】:

我开始在我的 js 应用程序(由 Babel 转译)中使用 async/await ES7 函数。

如果有错误,请纠正我,但它们是否仅适用于 Promise?如果是,这意味着我需要将常规回调函数包装到 Promise 中(顺便说一句,我目前正在做的事情)。

【问题讨论】:

  • 它也适用于 thenables :-)
  • @Bergi thenables 是承诺的超集吗?我从未将它们视为独立的实体。
  • @Bergi 这是承诺 :)
  • @Mathletics:是的,exactly。 Thenables 是具有未知功能和来源的then 方法的对象。
  • 是的,你也可以等待非承诺值,规范字面意思是 Promise.resolve 将在该值上调用,因此普通值将保持普通值,然后可将其转换为安全的承诺大大地。 thenable 意味着您可以在 await 中吸收来自不同库的承诺。

标签: javascript ecmascript-6 async-await babeljs ecmascript-2017


【解决方案1】:

是的,你await 一个承诺。

async function myFunction() {
  let result = await somethingThatReturnsAPromise();
  console.log(result); // cool, we have a result
}

http://pouchdb.com/2015/03/05/taming-the-async-beast-with-es7.html

【讨论】:

  • 我刚刚注意到,如果您使用请求github.com/request/request 并执行await request.get('url'),它将返回响应正文。这是否意味着请求库方法不仅基于回调?
  • @Kosmetika 你不能直接等待请求库,但你可以轻松地promisifyAll 它并以非常低的性能开销使用它。
  • @BenjaminGruenbaum 但它在等待而没有承诺这引起了我的困惑!
  • @BenjaminGruenbaum 奇怪的日子奇怪的方式.. :)
【解决方案2】:

当前(也可能是最终的)async/await 提案等待承诺,然后将其脱糖成类似于 bluebird 的 Promise.coroutine 的东西,await 扮演 yield 的角色。

这是有道理的,因为 Promise 代表一个值 + 时间,而您正在等待该值变为可用。注意await 还等待所有其他语言中的类似 Promise 的构造,例如 C# 或 Python (3.5+)。

请注意,将回调 API 转换为 Promise 非常容易,并且一些库提供了在单个命令中执行此操作的工具。详情请见How to convert an existing callback API to promises

【讨论】:

猜你喜欢
  • 2018-07-10
  • 2018-08-23
  • 1970-01-01
  • 1970-01-01
  • 2018-11-12
  • 2016-02-26
  • 2019-02-27
  • 2020-09-22
相关资源
最近更新 更多