javascript - 如何访问 .then() 链中先前的 Promise 结果?

标签 javascript scope promise bluebird es6-promise

我已将代码重组为 promises ,并构建了一个美妙的长扁平 promise 链,由多个.then()回调组成。最后我想返回一些复合值,并且需要访问多个中间 promise 结果。但是,序列中间的分辨率值不在最后一个回调的范围内,我如何访问它们?

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?
    });
}

最佳答案

打破链条

当您需要访问链中的中间值时,您应该将链分成您需要的单个部分。不要附加一个回调并以某种方式尝试多次使用其参数,而是将多个回调附加到同一个 promise - 无论您在哪里需要结果值。别忘了,一个promise just represents (proxies) a future value !接下来,从线性链中的另一个 Promise 派生出一个 Promise,然后使用库提供的 Promise 组合器来构建结果值。

这将带来非常简单的控制流程、清晰的功能组合,因此易于模块化。

function getExample() {
    var a = promiseA(…);
    var b = a.then(function(resultA) {
        // some processing
        return promiseB(…);
    });
    return Promise.all([a, b]).then(function([resultA, resultB]) {
        // more processing
        return // something using both resultA and resultB
    });
}

与仅在 ES6 中可用的 Promise.all 之后的回调中的参数解构不同,在 ES5 中,then 调用将被许多 Promise 库提供的漂亮的辅助方法所取代( QBluebirdwhen 、...): .spread(function(resultA, result) B) { ....

Bluebird 还具有专用的 join function用更简单(更高效)的构造替换 Promise.all+spread 组合:

…
return Promise.join(a, b, function(resultA, resultB) { … });

关于javascript - 如何访问 .then() 链中先前的 Promise 结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36384258/

相关文章:

javascript - 为什么在回调中取消 bluebird promise 会停止 setInterval?

javascript - 如何在 Javascript 中使用 Q 顺序运行 Promise?

javascript - 调用 json 中的第一个字符串

javascript - 如何缩短重复的 javascript php 代码

javascript - 在浏览器事件上调用触发器后,如何在完成时调用函数?

c - 一个函数正在从另一个函数中提取变量值,但我不希望它这样做,也不知道它是如何做到的

javascript - 未捕获( promise )TypeError : Cannont set property '0' of undefined

javascript - 在任何地方通过 Twitter 获取 oauth_token 和 oauth_token secret

c++ - 无法成功返回我通过在字符串上调用 c_str() 创建的 const char*。 (C++)

scope - 在 Fortran 中使用公共(public)/私有(private)语句的首选样式?