几个异步操作,全部执行完后再执行回调函数

方法一:通常的讲,我们可以设置一个flag变量,然后在各自的ajax的成功回调内去维护这个变量数量,当满足条件时,我们来触发后续函数

let flag = 0;
// ajax为异步操作,结合Promise使⽤可以轻松实现异步操作队列
function ajax1(num) {
  return new Promise(resolve => {
    setTimeout(() => {
			flag++;
			console.log('第1个异步请求'+flag); // 输出处理结果
			if (flag === 3) {
				donefn();
			}
			resolve();
    }, 3000);
  });
}

function ajax2() {
  return new Promise(resolve => {
    setTimeout(() => {
			flag++
			console.log('第2个异步请求'+flag); // 输出处理结果
			if (flag === 3) {
				donefn();
			}
			resolve();
    }, 2000);
  });
}

function ajax3() {
  return new Promise(resolve => {
    setTimeout(() => {
			flag++
			console.log('第3个异步请求'+flag); // 输出处理结果
			if (flag === 3) {
				donefn();
			}
			resolve();
    }, 1000);
  });
}

function donefn() {
	console.log('执行完成!');
}

ajax1();
ajax2();
ajax3();

方法二:Promise.all([promise1,promise2]).then(function(){})

// ajax为异步操作,结合Promise使⽤可以轻松实现异步操作队列
function ajax1(num) {
  return new Promise(resolve => {
    setTimeout(() => {
			console.log('第1个异步请求'); // 输出处理结果
			resolve();
    }, 3000);
  });
}

function ajax2() {
  return new Promise(resolve => {
    setTimeout(() => {
			console.log('第2个异步请求'); // 输出处理结果
			resolve();
    }, 2000);
  });
}

function ajax3() {
  return new Promise(resolve => {
    setTimeout(() => {
			console.log('第3个异步请求'); // 输出处理结果
			resolve();
		}, 1000);
  });
}

function donefn() {
	console.log('执行完成!');
}

Promise.all([ajax1(),ajax2(),ajax3()]).then(function(){console.log('执行完成!')})

方法三:使⽤Generator

// 使⽤Generator顺序执⾏三次异步操作
function* r(num) {
  yield ajax1(num);
  yield ajax2();
  yield ajax3();
}

// ajax为异步操作,结合Promise使⽤可以轻松实现异步操作队列
function ajax1(num) {
  return new Promise(resolve => {
    setTimeout(() => {
      console.log('第1个异步请求'); // 输出处理结果
      resolve()
    }, 1000);
  });
}

function ajax2() {
  return new Promise(resolve => {
    setTimeout(() => {
      console.log('第2个异步请求'); // 输出处理结果
      resolve(); // 操作成功
    }, 1000);
  });
}

function ajax3() {
  return new Promise(resolve => {
    setTimeout(() => {
      console.log('第3个异步请求'); // 输出处理结果
      resolve(); // 操作成功
    }, 1000);
  });
}

// 不使⽤递归函数调⽤
let it = r();

// 修改为可处理Promise的next
function next(data) {
  let { value, done } = it.next(data); // 启动
  if (!done) {
    value.then(() => {
      next();
    });
  } else {
    console.log('执行完毕!');
  }
}

next();
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值