ES2017 Async/await 函数 - 它们是不是仅适用于 Promise?

Posted

技术标签:

【中文标题】ES2017 Async/await 函数 - 它们是不是仅适用于 Promise?【英文标题】: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 中吸收来自不同库的承诺。 【参考方案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。

【讨论】:

是的,我同意它很容易切换,我的困惑是因为看到 - ***.com/questions/31294521/…

以上是关于ES2017 Async/await 函数 - 它们是不是仅适用于 Promise?的主要内容,如果未能解决你的问题,请参考以下文章

ReactNative进阶(三十六):ES6中async与await的使用方法详解

ES6中async和await说明和用法

JS学习- ES6 async await使用

promise 和 async await比较

使用 babel js 将 async/await 编译为 es5

ES7 async await