我目前正在测试Promises,而且我正在使用MDN示例
{{1}}
现在我想知道是否可以首先调用p1函数,然后在解决之后,用p2,p3,p4,p5调用Promise.all。
由于
答案 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));