Javascript 通过承诺链传递变量
有更好的方法吗Javascript 通过承诺链传递变量,javascript,ecmascript-6,bluebird,Javascript,Ecmascript 6,Bluebird,有更好的方法吗 let foo; return functionA().then(result => { foo = result; return functionB(); }).then(bar => { return functionC(foo, bar); }); 请注意,function的结果需要输入到functionC。使用promise范围之外的变量可以很好地工作,但感觉有点恶心。有没有一种干净的惯用方法 let foo; return functionA(
let foo;
return functionA().then(result => {
foo = result;
return functionB();
}).then(bar => {
return functionC(foo, bar);
});
请注意,function
的结果需要输入到functionC
。使用promise范围之外的变量可以很好地工作,但感觉有点恶心。有没有一种干净的惯用方法
let foo;
return functionA().then(result => {
foo = result;
return functionB();
}).then(bar => {
return functionC(foo, bar);
});
请注意,我没有机会更改我正在调用的任何函数的API。您可以尝试使用它传递一个承诺数组,当传递的所有承诺都已解决时,它在then()
回调中提供一个响应数组。您可以访问这些数组值以传递到函数C
:
Promise.all([functionA, functionB]).then(values => functionC(values[0], values[1]));
可能会更干净一些(没有嵌套),因为它看起来不像function
的响应需要传递到functionB
否则,嵌套将如下所示:
return functionA().then(foo => {
return functionB().then(bar => {
return functionC(foo, bar);
});
});
一个选项是,在写入时使用Promise.all(function(),functionB())
。这将同时运行这两个函数。如果这是你想要的,你可以用这个答案。但是,如果希望它们一个接一个地发生,然后还能够将结果传递给另一个处理程序,则可以执行以下操作:
function function(){
返回新承诺(resolve=>resolve(1));
}
函数B(){
返回新承诺(resolve=>resolve(2));
}
功能C(第一,第二){
返回第一个+第二个;
}
函数()
.then(result=>Promise.all([result,functionB()]))
.然后(函数([第一,第二]){
返回函数C(第一、第二);
})
。然后(结果=>{
控制台日志(结果);
});代码>你可以尝试一个嵌套的承诺:/(也感觉很恶心)我想这方面的大多数选项都包含在中。谢谢<代码>承诺。所有的
都是最好的例子。一个小小的简化是functionC(…values)
。当第一个function
的结果用于调用第二个functionB
时,这非常有用,非常感谢!!