我已经将我的代码重组为promises,并构建了一个奇妙的长平面promise链,由多个.then()回调组成。最后,我想返回一些复合值,并需要访问多个中间承诺结果。但是,序列中间的分辨率值不在上一次回调的范围内,如何访问它们
函数getExample(){
返回允诺(…)。然后(函数(结果){
//一些加工
返还承诺人(……);
}).then(函数(resultB){
//更多处理
return//如何在此处访问resultA?
});
}
打破锁链
当需要访问链中的中间值时,应该将链拆分为所需的单个部分。与其附加一个回调函数并试图多次使用它的参数,不如将多个回调函数附加到同一个promise上——无论您需要结果值在哪里。别忘了,承诺只代表(代理)未来的价值!在线性链中从另一个承诺中导出一个承诺之后,使用库提供给您的承诺组合符来构建结果值
这将导致非常简单的控制流程、功能的清晰组合,因此易于模块化
函数getExample(){
var a=允诺(…);
var b=a.then(函数(结果){
//一些加工
返还承诺人(……);
});
返回Promise.all([a,b])。然后(函数([resultA,resultB]){
//更多处理
return//something同时使用resultA和resultB
});
}
而不是在Promise.all之后在回调中对参数进行解构,这只会变得有用­;可以使用ES6,在ES5中,then调用将被许多promise库(Q、Bluebird、when等)提供的漂亮助手方法所取代:.spread(function(resultA、resultB){…
Bluebird还具有一个专用的join功能,以取代承诺。所有+扩展组合具有更简单(更高效)的结构:
…
返回Promise.join(a,b,function(resultA,resultB){…});