异步发送A、B、C,如何做让A、B、C成功发送后,再发送D

如题,异步发送A、B、C,如何做让A、B、C成功发送后,再发送D

阅读 5.9k
13 个回答

全部包装为promise之后,一个一个执行

设置标志

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=[];
    }
}

es7 的话试试 async/await 自己组合,可以很简单实现各种复杂嵌套问题

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~
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题