当前位置: 首页 > 面试题库 >

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

罗昊明
2023-03-14
问题内容

我已经将我的代码重组为promises,并建立了一个精彩的长期承诺链,其中包含多个.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?
    });
}

问题答案:

当然,语言设计者也意识到了这个问题。他们做了很多工作,异步函数提案最终使它成为了

ECMAScript 8

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

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关键字将执行分段。这些切片可以相互独立,甚至异步地运行-这就是我们要在执行下一步之前等待promise解析时所要做的。

有专用的库(例如co或task.js),但是还有许多Promise库具有辅助函数(Q,Bluebird,when …),当您为它们提供生成器函数时,它们会为您逐步执行异步操作产生希望。

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

This did work in Node.js since version 4.0, also a few browsers (or their dev
editions) did support generator syntax relatively early.

ECMAScript 5

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

然后,还有许多其他 专门用于简化异步编程的可编译为JS的语言。他们通常使用类似语法await(例如冰的CoffeeScript),但也有其他人配备了哈斯克尔样do-notation(如LatteJs,一元,PureScript或LispyScript)。



 类似资料:
  • 问题内容: 我已经将我的代码重组为promises,并建立了一个精彩的长期承诺链,其中包含多个.then()回调。最后,我想返回一些复合值,并且需要访问多个中间promise结果。但是,序列中间的分辨率值不在上次回调的范围内,如何访问它们? 问题答案: 当然,语言设计者也意识到了这个问题。他们做了很多工作,异步函数提案最终使它成为了 ECMAScript 8 您不再需要单个调用或回调函数,因为在异

  • 问题内容: 我这样承诺 返回一个promise,yes 不能被修改 。 我如何在第一场比赛中脱颖而出?(除了显式抛出错误以外,还有其他方法吗?) 问题答案: 我想你不想在这里连锁。以同步的方式,您会写 这就是应如何将其转化为承诺: 诺言没有实现。

  • 问题内容: 我正在做的事情涉及按顺序运行(进行一些设置,然后运行调用者感兴趣的实际命令),然后进行一些清理)。 就像是: 哪里是这样的: 在内部,我使用,它返回,并且有效地将事件的结果从返回给调用者。 现在,我还需要将事件从stdout和stderr发送到调用者,这些事件也来自EventEmitters。是否有一种方法可以使(Bluebird)Promises正常工作,或者它们只是妨碍发出多个事件

  • 问题内容: 使用node.js版本7.7.2,我要执行一个异步函数,然后在第一个函数完成后执行另一个函数,如下所示: 问题是此安装程序打印“栏已被开除”,然后打印“foo将要解决”。我期望的是,bar将等待触发,直到foo返回的promise被解决为止。我是否误解了then()如何将回调在node.js事件循环中排队? 谢谢 问题答案: 如注释中所述,将一个函数传递给该函数,当该函数被调用时,将使

  • 问题内容: 为了在数据库中创建对象,我已经创建了许多许诺。 最后,我要按我想要的顺序履行所有诺言。(因为somes对象依赖于其他对象,所以我需要保持该顺序) 所以我希望看到: 不幸的是,这些消息被打乱了,我不明白。 谢谢 问题答案: 看起来您理解了Promise错误,请重新阅读有关Promise和本文的一些教程。 使用创建承诺后,它会立即被调用,因此所有函数实际上都是在创建它们时执行的,而不是在链

  • 问题内容: 我有一个名为PaymentStrategy的服务,已注入我的控制器中。 paymentStrategy中的这种购买方法会触发几种需要顺序调用的方法。当buy()中的所有方法都完成后,需要调用then()。 这可能是微不足道的,但我对棱角还很陌生。 目前,在init()方法之后立即触发buy()。then()。我觉得我们需要将所有这些方法放在一个promise中,并应用$ q.all()