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
时,这非常有用,非常感谢!!