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

我已经将我的代码重组为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 Harmony

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

回答:

你不再需要单个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

}

回答:

在等待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.

回答:

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

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

以上是 JavaScript 如何访问.then()链中以前的承诺结果? 的全部内容, 来源链接: utcz.com/qa/416190.html

回到顶部