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.
});

posted on 2023-01-10 10:32  疯狂的妞妞  阅读(863)  评论(0编辑  收藏  举报

导航