如何将 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
。
我目前正在测试 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
。