等到所有Ajax在另一个Ajax内完成处理,然后发送数据

时间:2017-07-06 17:19:00

标签: javascript jquery ajax asynchronous

我正在尝试使用来自多个其他Ajax请求的数据发送数据。问题出现时sendDataOffAjax()被调用,没有发送实际数据,因为它会在任何其他函数发生更改以添加数据之前触发。我可以通过在任何地方使用asyn: false轻松解决这个问题,但从我读到的内容来看,这是不好的做法。

这是我的代码:

let requests = [];
$.ajax({
    url: someUrl,
    method: 'GET',
    dataType: 'json',
    complete: function (data) {
        if (data.exists) {
            if (condition) {
                requests.push(anotherAjax());
            }
            if (condition) {
                requests.push(someDifferentAjax());
            }
        }
        requests.push(alwaysRunAjax());
    }
}).done(function () {
    $.when.apply($, requests).done(function () {
        sendDataOffAjax();
    });
});

看看anotherAjax()看起来像什么(所有其他Ajax请求也是这样的):

function anotherAjax() {
    return $.ajax({
        url: someUrl,
        headers: {
            'Accept': 'application/json',
            'Content-Type': 'application/json'
        },
        method: 'GET',
        dataType: 'json',
        complete: function (data) {
            if (data.exists) {
                toSendData.data['NEW_DATA'] = {
                    'data': data.responseJSON
                }
            }
            //send complete signal?
        }
    })
}

我怎么能让它等到通过其他Ajax请求添加所有数据,然后启动sendDataOffAjax()

日志如下所示:

Data sent
anotherAjax Data added
alwaysRunAjax Data added
someDifferentAjax Data added

2 个答案:

答案 0 :(得分:0)

对于ajax请求,.complete(),根据jQuery的文档,只有运行后才会运行成功或错误回调,而.done()是与调用.success()相同。因此,考虑到这一点,您可以了解为什么完成回调中的代码首先运行。您应该能够将代码从完整的回调切换到完成的回调,反之亦然,以获得所需的效果。

所以试试:

let requests = [];
$.ajax({
  url: someUrl,
  method: 'GET',
  dataType: 'json',
  complete: function () {
    $.when.apply($, requests).done(function () {
      sendDataOffAjax();
    });
  }
}).done(function (data) {
  if (data) {
    if (condition) {
      requests.push(anotherAjax());
    }
    if (condition) {
      requests.push(someDifferentAjax());
    }
 }
 requests.push(alwaysRunAjax());
});

现在,只要您在此处调用的所有ajax函数都返回延迟对象,您的请求数组应该被填充,而$ .when()应该等到所有延迟对象都解析。

答案 1 :(得分:-2)

如果没有async:false,这是不可能的。 它不被认为是一件好事的原因是因为它违背了异步Ajax的想法。 async:false baisiclly" lock"你的应用程序直到你的请求完成,当你把它放在太多的ajax调用上时,它会让你的apllication看起来非常慢。 在您的情况下,如果您在2个函数上使用async:false,只要他们不需要花费很长时间来执行就可以了。