我正在尝试使用来自多个其他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
答案 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
,只要他们不需要花费很长时间来执行就可以了。