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