如何将 Promise 'then' 与 'all' 链接起来

How to chain a Promise 'then' with 'all'

我目前正在测试 Promises 并且正在使用 MDN 示例

var p1 = new Promise((resolve, reject) => { 
  setTimeout(resolve, 1000, "one"); 
}); 
var p2 = new Promise((resolve, reject) => { 
  setTimeout(resolve, 2000, "two"); 
});
var p3 = new Promise((resolve, reject) => {
  setTimeout(resolve, 3000, "three");
});
var p4 = new Promise((resolve, reject) => {
  setTimeout(resolve, 4000, "four");
});
var p5 = new Promise((resolve, reject) => {
  reject("reject");
});

Promise.all([p1, p2, p3, p4, p5]).then(value => { 
  console.log(value);
}, reason => {
  console.log(reason)
});

现在我想知道是否可以先调用 p1 函数,然后在解决该问题后,用 p2、p3、p4、p5 调用 Promise.all。

谢谢

如果你想把所有的 promise 串起来,你可以这样做。

var p1 = new Promise((resolve, reject) => { 
  setTimeout(resolve, 1000, "one"); 
}); 
var p2 = new Promise((resolve, reject) => { 
  setTimeout(resolve, 2000, "two"); 
});
var p3 = new Promise((resolve, reject) => {
  setTimeout(resolve, 3000, "three");
});
var p4 = new Promise((resolve, reject) => {
  setTimeout(resolve, 4000, "four");
});
var p5 = new Promise((resolve, reject) => {
  reject("reject");
});

var proms = [p1,p2,p3,p4,p5],
   result = proms.reduce((pp,cp) => pp.then(v => { console.log(v);
                                                   return cp;
                                                 }))
                 .then( v => console.log(v))
                 .catch(e => console.log("error at: ",e));

首先,您没有正确使用它们。 new Promise 立即启动其参数函数,因此如果您想控制何时 启动 Promise,您应该让函数返回 Promise 而不是原始 Promise 对象。

w = console.log.bind(console);

var p1 = () => new Promise(r => {
   w('start p1');
   setTimeout(() => r(w('end p1')), 1000)
});

var p2 = () => new Promise(r => {
   w('start p2');
   setTimeout(() => r(w('end p2')), 200)
});

var p3 = () => new Promise(r => {
   w('start p3');
   setTimeout(() => r(w('end p3')), 3000)
});

var p4 = () => new Promise(r => {
   w('start p4');
   setTimeout(() => r(w('end p4')), 40)
});


p1()
  .then(() => Promise.all([p2(), p3(), p4()]))
  .then(() => w('all done'))

这会等待 p1 完成,然后同时执行 p2..4