使用Promise.all([a(),b()]).then(c())无法保证a()和b()中的ajax执行完成后执行c()?

新手上路,请多包涵

异步获取两个数据,并在执行完后更新前台渲染,但现在数据还没获取到最后的函数已经执行,代码如下

function a(e) {
    if (e) {
        $.ajax({
            url: '../../a.ashx',
            data: { },
            type: 'get',
            success: function (data) {
                console.log(a);
            }
        })
    } else {
    }
}
function b(e) {
    if (e) {
        $.ajax({
            url: '../../b.ashx',
            data: {},
            type: 'get',
            success: function (data) {
                console.log(b);
            }
        })
    } else {
    }
}
function c(){
    console.log(1);
}
Promise.all([GetTimes(), GetPackage()]).then(c());

执行结果类似这样:

1
a
b

求解。

阅读 5.6k
5 个回答

抱歉看错了。。。

function a() {
    return new Promise(res,rej){
        if(e) {
            $.ajax({
                url: '../../a.ashx',
                data: { },
                type: 'get',
                success: function (data) {
                    res(data)
                }
            })
        }
    }
}

function b() {
    return new Promise(res,rej){
        if(e) {
            $.ajax({
                url: '../../b.ashx',
                data: { },
                type: 'get',
                success: function (data) {
                    res(data)
                }
            })
        }
    }
}
function c(){
    console.log(1);
}
Promise.all([a(), b()]).then(c());

你的函数要有返回值才行,你的ajax本身就是异步的,所以本身就可以是一个promise,然后返回,这样在promise.all里面才是一个队列

要遵循promise函数格式,要有返回值哦

Promise.all() 的参数应该是多个返回值为 promise 的函数的数组。

function sleep(s) {
    return new Promise((resolve) => {
        setTimeout(resolve, s * 1000);
    });
}

function promiseA() {
    return sleep(1).then(() => 'promiseA');
}

function promiseB() {
    return sleep(3).then(() => 'promiseB');
}

Promise.all([
    promiseA(),
    promiseB(),
]).then(res => {
    console.log(res);
    console.log('finish!');
});

// 输出
// ['PromiseA', 'PromiseB']
// 'finish'

all()里的参数要是一个promise。


根据评论里的纠正,你的前两个函数本身直接返回了false,所以触发了Promise.all的resolve,而此时a和b的内部的请求是异步的,所以会在promise.all的resolve之后执行。

推荐问题