我如何创build一个像钻石一样的js承诺链

我坚持承诺。

说我的程序结构是这样的

Func A //gets data then passes to I1 and J2 / \ Func I1 Func J1 //then route I & J run without interaction | | Func I2 Func J2 \ / Func B //Func B gets both the result of both 

我有一些麻烦得到这个工作。 我就是这样

  getdata.then(data=>{ var methods = Promise.all([ funci1.x(data).then(output=>{ funci2.x(output) }), funcj1.x(data).then(output2=>{ funcj2.x(output2) }) ]) methods.then(([a,b])=>{ console.log(a,b); }) }) 

但似乎没有工作。 任何帮助?

你不会在你的两个then()callback函数中返回任何可以转化为Promise东西,所以把它改为:

 getdata.then(data => { var methods = Promise.all([ funci1.x(data).then(output => funci2.x(output)), funcj1.x(data).then(output2 => funcj2.x(output2)) ]) methods.then(([a, b]) => { console.log(a, b); }) }) 

我个人发现,用这种方式写的承诺更容易识别正在发生的事情。

 const funcJ1 = (num) => { num = num + 1; return funcJ2(num); } const funcJ2 = (num) => ( new Promise((resolve, reject) => { num = num + 1; resolve(num); }) ); const funcI1 = (num) => { num = num + 1; return funcI2(num); } const funcI2 = (num) => ( new Promise((resolve, reject) => { num = num + 1; resolve(num); }) ); const funcB = (result) => { let total = 0; total = total + result[0]; // first promise result total = total + result[1]; // second promise result console.log(total); }; const funcA = (x) => { const promises = []; promises.push(funcJ1(x)); promises.push(funcI2(x)); Promise.all(promises).then((res) => { funcB(res); // done with I and J }).catch((e) => { throw e; }); } funcA(1); 

funcJ1和funcI1都会并行运行,而funcB将在funcJ2和funcI2完成后运行。

看到这个jsfiddle https://jsfiddle.net/6fvLw8wv/