如何链接承诺'然后'与所有'

时间:2016-08-30 08:34:05

标签: javascript es6-promise

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

{{1}}

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

由于

2 个答案:

答案 0 :(得分:2)

首先,你没有正确使用它们。 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

答案 1 :(得分:-1)

如果您希望将所有承诺链接起来,可以执行以下操作。

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));