有一些业务场景下,比如上传文件扫描图等,需要严格按照顺序上传,这就需要一个方法能保证这些操作任务串联执行。
Promise的then方法链式调用可以串联多个同步/异步任务,可以实现此功能。
function task1(){
return new Promise(function(resolve, reject){
setTimeout(()=>{
var random = Math.random() * 10;
console.log('task1成功了!' + random)
resolve();
}, 1000);
});
}
function task2(){
return new Promise(function(resolve, reject){
console.log('task2成功了!(同步)');
resolve();
});
}
function task3() {
return new Promise(function(resolve, reject){
setTimeout(()=>{
var random = Math.random() * 10;
console.log('task3成功了!' + random);
resolve();
}, 2000);
});
}
task1()
.then(task2)
.then(task3);
// task1成功了!1.045008008446917
// task2成功了!(同步)
// task3成功了!1.500076958531067
上面这种写法,将异步/同步任务枚举出来,用Promise的then方法串联,无疑可以实现按顺序执行。
但若有数十甚至上百个任务,这种方法显然不太合适。
下面,改进版来啦~~
// reduce 实现
function promiseChain2() {
return tasks.reduce((cur, next) => {
return cur.then(next);
}, Promise.resolve());
}
promiseChain2();
// task1成功了!3.193540121386289
// task2成功了!(同步)
// task3成功了!6.322561289236748
const tasks = [task1, task2, task3]
// for of + async await 实现
async function promiseChain() {
for (const promiseFn of tasks) {
await promiseFn();
}
}
promiseChain();
// task1成功了!0.19890734223483086
// task2成功了!(同步)
// task3成功了!6.863701371795488