javascript - 循环调用Promise函数
业务场景:封装文件上传组件,有多个文件需要提交的时候,应当顺序提交,如果中间出现问题,需要终止文件提交。
基本方案:Promise 是 ES6 新增的语法,我们一般会用 Promise 来封装我们的提交函数。
顺序调用 n 次
封装
/**
* 链式递归调用 Promise 函数
*
* @param call 回调函数
* @param i 起始数值
* @param len 终止数值
* @returns {Promise<any>}
*/
static linkedPromise(call, i, len) {
return new Promise(resolve => {
call(resolve, i);
}).then(()=>{
i++;
if(i < len){
return this.linkedPromise(call, i, len);
} else {
return Promise.resolve();
}
})
}
使用方式:
Layers.linkedPromise((resolve, i) => {
setTimeout(()=>{
console.log(i);
if(i > 5){
throw '';
}
resolve();
}, 1000)
}, 0, 10);
级联调用
/**
* 比如你封装了这么个 Promise 行数
*/
static ajax(){
return Promise.resolve();
}
// 可以采用这种方式,要调用几次,就 then() 几次
Promise.resolve(ajax).then(action => {
return action('test1').then(str => {
console.log(str);
return action;
});
}).then(action => {
return action('test1').then(str => {
console.log(str);
return action;
});
}).catch(e=>{
console.err(e);
});
Promise.all
还可以使用 all 语法
let arr = [ajax(), ajax()];
Promise.all(arr).then(ret => {
// do sth.
}).catch(err => {
// do sth.
});
疯狂的妞妞 :每一天,做什么都好,不要什么都不做!