我已经将我的代码重组为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.all
then
.spread(function(resultA, resultB) { …
Bluebird 还具有专用功能,可将 + 组合替换为更简单(且更高效)的结构:join
Promise.all
spread
…
return Promise.join(a, b, function(resultA, resultB) { … });
当然,这个问题也被语言设计者所认可。他们做了很多工作,异步函数提案最终变成了
您不再需要单个调用或回调函数,因为在异步函数(被调用时返回 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
}
在我们等待 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 版以来,一些浏览器(或其开发版本)也相对较早地支持生成器语法。
但是,如果您希望/需要向后兼容,则不能在没有转译器的情况下使用它们。当前工具支持生成器函数和异步函数,例如请参阅 Babel 关于生成器和异步函数的文档。
然后,还有许多其他编译到JS语言
致力于简化异步编程。他们通常使用类似于 的语法(例如 Iced CoffeeScript),但也有一些语法具有类似 Haskell 的符号(例如 LatteJs、monadic、PureScript 或 LispyScript)。await
do
将以后需要的值的承诺分配给变量,然后通过同步检查获取其值。该示例使用 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】栏目查找您需要的精美模板。