首页 > JavaScript > JavaScript 如何在 .then() 链中访问以前的 promise 结果?

JavaScript 如何在 .then() 链中访问以前的 promise 结果?

上一篇 下一篇

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

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

分割线

网友回答:

打破链条

当您需要访问链中的中间值时,您应该将链拆分为所需的单个部分。与其附加一个回调并以某种方式尝试多次使用其参数,不如将多个回调附加到同一个承诺 – 无论您需要结果值的任何地方。不要忘记,承诺只是代表(代理)未来的价值!除了从线性链中的另一个承诺派生一个承诺之外,使用库提供给你的承诺组合器来构建结果值。

这将导致一个非常简单的控制流程,清晰的功能组合,因此易于模块化。

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 库(Q、Bluebird、when、…)提供的漂亮助手方法所取代,而不是回调中的参数解构。Promise.allthen.spread(function(resultA, resultB) { …

Bluebird 还具有专用功能,可将 + 组合替换为更简单(且更高效)的结构:joinPromise.allspread

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

分割线

网友回答:

ECMAScript Harmony

当然,这个问题也被语言设计者所认可。他们做了很多工作,异步函数提案最终变成了

ECMAScript 8

您不再需要单个调用或回调函数,因为在异步函数(被调用时返回 promise)中,您只需等待 promise 直接解析即可。它还具有任意控制结构,如条件、循环和 try-catch-clause,但为了方便起见,我们在这里不需要它们:then

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带有生成器函数,允许在任意放置的关键字上将执行分解为碎片。这些切片可以相互跟踪,独立运行,甚至可以异步运行 – 当我们想要等待承诺解决方案后再运行下一步时,这就是我们所做的。yield

有专门的库(如co或task.js),但也有许多promise库具有辅助函数(Q,Bluebird,when,…),当您为它们提供产生promise的生成器函数时,它们会为您执行这种异步分步执行。

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 中确实有效.js自 4.0 版以来,一些浏览器(或其开发版本)也相对较早地支持生成器语法。

ECMAScript 5

但是,如果您希望/需要向后兼容,则不能在没有转译器的情况下使用它们。当前工具支持生成器函数和异步函数,例如请参阅 Babel 关于生成器和异步函数的文档。

然后,还有许多其他编译到JS语言
致力于简化异步编程。他们通常使用类似于 的语法(例如 Iced CoffeeScript),但也有一些语法具有类似 Haskell 的符号(例如 LatteJs、monadic、PureScript 或 LispyScript)。
awaitdo

分割线

网友回答:

同步检测

将以后需要的值的承诺分配给变量,然后通过同步检查获取其值。该示例使用 bluebird 的方法,但许多库提供类似的方法。.value()

function getExample() {
    var a = promiseA(…);

    return a.then(function() {
        // some processing
        return promiseB(…);
    }).then(function(resultB) {
        // a is guaranteed to be fulfilled here so we can just retrieve its
        // value synchronously
        var aValue = a.value();
    });
}

This can be used for as many values as you like:

function getExample() {
    var a = promiseA(…);

    var b = a.then(function() {
        return promiseB(…)
    });

    var c = b.then(function() {
        return promiseC(…);
    });

    var d = c.then(function() {
        return promiseD(…);
    });

    return d.then(function() {
        return a.value() + b.value() + c.value() + d.value();
    });
}

模板简介:该模板名称为【JavaScript 如何在 .then() 链中访问以前的 promise 结果?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【JavaScript】栏目查找您需要的精美模板。

相关搜索
  • 下载密码 lanrenmb
  • 下载次数 367次
  • 使用软件 Sublime/Dreamweaver/HBuilder
  • 文件格式 编程语言
  • 文件大小 暂无信息
  • 上传时间 04-21
  • 作者 网友投稿
  • 肖像权 人物画像及字体仅供参考
栏目分类 更多 >
热门推荐 更多 >
企业网站 响应式 单页式简历模板 自适应 微信文章 微信素材 微信模板 html5 微信图片 微信公众平台
您可能会喜欢的其他模板