ECMAScript Harmony
当然,这个问题也得到了语言设计者的认可.他们做了很多工作,async functions proposal人最终进入了
ECMAScript 8
您不再需要单个then
调用或回调函数,因为在异步函数(被调用时返回promise )中,您只需等待promise 直接解析即可.它还具有任意的控制 struct ,如条件、循环和try-catch-子句,但为方便起见,这里不需要它们:
async function getExample() {
var resultA = await promiseA(…);
// some processing
var resultB = await promiseB(…);
// more processing
return // something using both resultA and resultB
}
ECMAScript 6
在等待ES8时,我们已经使用了一种非常类似的语法.ES6附带了generator functions个关键字,可以在任意放置yield
个关键字的情况下将执行拆分为多个部分.这些切片可以相互独立甚至异步地运行——当我们想在运行下一步之前等待promise 解决方案时,我们就是这样做的.
有专门的库(如co或task.js),但也有许多promise库具有帮助函数(Q、Bluebird、when等),当您给它们一个生成promise 的生成器函数时,它们可以为您提供this async step-by-step execution.
var getExample = Promise.coroutine(function* () {
// ^^^^^^^^^^^^^^^^^ Bluebird syntax
var resultA = yield promiseA(…);
// some processing
var resultB = yield promiseB(…);
// more processing
return // something using both resultA and resultB
});
这在Node中确实有效.自4.0版以来,也有一些浏览器(或其开发版本)相对较早地支持生成器语法.
ECMAScript 5
然而,如果你想/需要向后兼容,你不能使用没有transpiler的设备.当前工具支持生成器功能和异步功能,例如参见Babel on generators和async functions的文档.
此外,还有许多其他compile-to-JS languages个