如何在一个同步块(jquery)中异步执行多个ajax调用

时间:2017-10-10 18:41:16

标签: javascript jquery ajax asynchronous jquery-deferred

我知道如何使用$ .when一次执行多个ajax调用。 E.g:

$.when( d1, d2 ).done(function ( v1, v2 ) {
    console.log( v1 ); // "Fish"
    console.log( v2 ); // "Pizza"
})

但是,我想在一个方法中使用它,以便我可以多次使用它来返回一个值(例如

function getDataFor(list) {
    var data = [];

    $.when(d1(list), d2(list)).done(function (v1, v2) {
        console.log(v1);
        console.log(v2);

        data = [v1, v2];
    });

    return data;
}

这是什么格式?另外,在上面的例子中使用.then over .done是否基本无用,除非我计划在另一个承诺之后遵循那个?

编辑:我不认为这是一个重复的问题。虽然我理解为什么会这样,但我真的只是想知道是否有一个开箱即用的或基于库的(例如,jquery / bluebird)包装器,如.NET的WaitAll方法,它采用一组异步调用并阻塞线程,直到它们全部完成。我已经接受了这是不可能的,但我觉得它不重复。

1 个答案:

答案 0 :(得分:1)

不,函数多次返回都不可能,并且在ajax请求成功之前it's not possible to return any result variables。但是,您可以简单地返回结果数组的承诺 - 但为此您需要use then instead of done,以便您可以从回调中return。 (Protip:只是从不使用donefail)。

function getDataFor(list) {
    return $.when(d1(list), d2(list)).then(function (v1, v2) {
//  ^^^^^^                            ^^^^
        console.log(v1);
        console.log(v2);

        var data = [v1, v2];
        return data;
//      ^^^^^^
    });
}