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
将在该值上调用,因此普通值将保持普通值,然后可将其转换为安全的承诺大大地。 then
able 意味着您可以在 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的使用方法详解