如何确定所有ajax请求都已解决?

时间:2017-09-24 05:49:05

标签: javascript jquery ajax promise

这是我的代码:

function ajaxRequest(value, path, website){
    var status = false;
    return new Promise(function (resolve, reject) {
        window[website] = $.ajax({
            url :  path,
            type : 'GET',
            data: { "name": value,
                    "_token": $('meta[name="_token"]').attr('content')
            },

            beforeSend: function(){
                if(window[website] != null) {
                    window[website].abort();
                }
            },
            success: function (people) {
                status = true;
                resolve([status, people]);
            },

            error: function (jqXHR, textStatus, errorThrown) {
                reject([status, textStatus]);

            },

            timeout: 20000

        });
    });
}

我将这个函数称为:

ajaxRequest('Jack', 'search/twitter', 'twitter').then(function(res) { console.log(res)}, function(err){console.log(err)});
ajaxRequest('Jack', 'search/instagram', 'instagram').then(function(res) { console.log(res)}, function(err){console.log(err)});

现在我需要知道这两个ajax请求已经完成。我怎么能这样做?

注意我认为我必须使用promise.all(),但不确定如何在我的情况下使用它。

2 个答案:

答案 0 :(得分:2)

你是对的,promise.all()是为了解决这个问题而发明的。 它所做的就是返回一个承诺,当所有给定的Promise得到解决时,它将得到解决。

在您的情况下,您可以使用Promise.all这样的内容包装2个ajax调用:

promise.all([
   ajaxRequest('Jack', 'search/twitter', 'twitter').then(function(res) { console.log(res)}, function(err){console.log(err)}),
   ajaxRequest('Jack', 'search/instagram', 'instagram').then(function(res) { console.log(res)}, function(err){console.log(err)})
]).then(([response1, response2]) => {
   // Here you execute your logic when both of the promises are resolved.
})

答案 1 :(得分:1)

您可以将函数调用传递给$.when()。注意,jQuery.ajax()返回一个jQuery promise对象,没有必要使用Promise构造函数

$.when(ajaxRequest(), ajaxRequest())
.then(function(...results) {
  // do stuff with `results` array
})
.fail(function(jqxhr, textStatus, errorThrown) {
  console.error(errorThrown)
})