我已经将我的代码重构为promises,并构建了一个非常长的flat promise chain,由多个.then()个回调组成.最后,我想返回一些组合值,并且需要访问倍数intermediate promise results.但是,序列中间的解析值在最后一个回调中不在作用域中,我如何访问它们呢?

function getExample() {
    return promiseA(…).then(function(resultA) {
        // Some processing
        return promiseB(…);
    }).then(function(resultB) {
        // More processing
        return // How do I gain access to resultA here?
    });
}

推荐答案

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 解决方案时,我们就是这样做的.

有专门的库(如cotask.js),但也有许多promise库具有帮助函数(QBluebirdwhen等),当您给它们一个生成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 generatorsasync functions的文档.

此外,还有许多其他compile-to-JS languages

Javascript相关问答推荐

禁用从vue.js 2中的循环创建的表的最后td的按钮

django无法解析余数:[0] from carray[0]'

React 17与React 18中的不同setState行为

使用JavaScript重新排序行

判断表格单元格中是否存在文本框

Rehype将hashtag呈现为URL

当试图显示小部件时,使用者会出现JavaScript错误.

分层树视图

在拖放时阻止文件打开

JSDoc创建并从另一个文件导入类型

如何在输入元素中附加一个属性为checkbox?

从页面到应用程序(NextJS):REST.STATUS不是一个函数

检索相加到点的子项

类构造函数忽略Reaction Native中的可选字段,但在浏览器中按预期工作

VSCode中出现随机行

在开发期间,Web浏览器如何运行&qot;.jsx&qot;文件?

将对象推送到数组会导致复制

将基元传递给THEN处理程序

P5JS-绘制不重叠的圆

使用createBrowserRoutVS BrowserRouter的Reaction路由