如题,异步发送A、B、C,如何做让A、B、C成功发送后,再发送D
设置标志
var flag = 0;
function checkAndSendD(tag) {
flag |= tag;
if (flag === 7) {
// 发送D
}
}
$.post(A, function() {
checkAndSendD(1);
})
$.post(B, function() {
checkAndSendD(2);
})
$.post(C, function() {
checkAndSendD(4);
})
function A(){
succ: D(res)
fail: D(err)
}
B C 类似
function D () {
if count == totalSum
发送D请求
else
count++
}
那么发送请求D
Promise.all([
new Promise(
(resolve, reject)=>{
// async A
setTimeout(()=>resolve(100), 2000)
}
),
new Promise(
(resolve, reject)=>{
// async B
setTimeout(()=>resolve({a:"this is async B"}), 4000)
}
)
]).then(
(d1, d2)=>console.log(d1,d2)
)
针对A/B/C三个请求为异步请求,哪个是最后完成请求的不确定,所以需要声明三个flag变量分别对应三个请求,在这三个请求成功的回调函数中添加条件来调用D事件,这个条件为三个flag变量均为true即可。
$.when($.ajax({
// A...
}), $.ajax({
// B...
}), $.ajax({
// C...
})).done(function() {
$.ajax({
// D...
});
}).fail(function() {
// fail...
});
使用 async 语法,包装在一个 Promise.all 内即可,实现如下:
let getPerData = async () => {
let p1 = ajax('A')
let p2 = ajax('B')
let p3 = ajax('C')
await Promise.all([p1, p2, p3])
}
getPerData().then(res => {
ajax('D')
})
promise 是 一种方式,但考虑到时es6 可以先转换,还可以用计数器之类的
var sends = [];
sendA(() =>{
sends.push(1);
ls();
});
sendB(() =>{
sends.push(1);
ls();
});
sendC(() =>{
sends.push(1);
ls();
});
function ls(){
if(sends.length >=3){
sendD();
sends=[];
}
}
let p1 = new Promise((resolve) =>{
ajax().then(function(data1){
resolve(data1)
})
})
let p2 = new Promise((resolve) =>{
ajax().then(function(data2){
resolve(data2)
})
})
let p3 = new Promise((resolve) =>{
ajax().then(function(data3){
resolve(data3)
})
})
Promise.all([p1, p2, p3]).then(values => {
console.log(values); // [data1, data2, data3]
});
function sleep(second) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('request done! ' + Math.random());
}, second);
})
}
async function correctDemo() {
console.time("时间二");
let p1 = sleep(1000);
let p2 = sleep(1000);
let p3 = sleep(1000);
await Promise.all([p1, p2, p3]);
console.log('clear the loading~');
console.timeEnd("时间二");
//输出:时间二: 1014.670166015625ms
}
correctDemo(); // clear the loading~
13 回答13.1k 阅读
7 回答2.3k 阅读
3 回答1.4k 阅读✓ 已解决
6 回答1.4k 阅读✓ 已解决
2 回答1.5k 阅读✓ 已解决
3 回答1.5k 阅读✓ 已解决
6 回答1.2k 阅读
全部包装为promise之后,一个一个执行