方法一:通常的讲,我们可以设置一个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();