Promise是我们处理异步操作的时候经常用到的。
有的时候我们会需要顺序执行很多异步操作,如果操作比较少的时候还可以写成a.then(b).then(c)...,可是如果异步操作很多的时候就不能这样写了。
可以利用数组的reduce函数达到同样的效果,这个时候不管有多少异步操作都可以连在一起了。
代码如下:
function waitPromise(time) {
console.log(time);
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('resolved');
}, time);
});
}
function log(data) {
return new Promise((resolve, reject) => {
console.log(data + '@' + (new Date().getSeconds()));
resolve();
});
}
var ps = [];
for (var i = 0; i < 3; i++) {
let time = (i + 1) * 1000;
ps.push(() => waitPromise(time));
ps.push(log);
}
console.log('started' + '@' + (new Date().getSeconds()));
var p = Promise.resolve();
ps.reduce((p, c) => {
return p.then(c)
}, p).then(() => {
console.log('all finished');
}).catch(reject => {
console.log('reject', reject)
});
输出结果:
started@59 1000 resolved@0 2000 resolved@2 3000 resolved@5 all finished