进行多次 AJAX 调用 $.when.apply($, array) 无法正常工作
Making multiple AJAX calls $.when.apply($, array) not working properly
我正在尝试了解有关 ajax 调用的更多信息并进行一些测试。由于异步,我 运行 陷入了困境。在 this website 的帮助下,我找到了我认为应该有效的东西。不知何故,事情仍然 运行 不正确。我摆弄了很多东西,但仍然没有让事情按照我喜欢的方式工作。
背景:
- 在
array
中捕获可变数量的 ID
- 通过
$.ajax
调用迭代以更新 ID(api 无法进行批处理请求)。
$(document).ready(function() {
$("#button").click(function() {
var deffered, deferreds = [];
$.each(arr, function(i, array) {
deferred = $.ajax({ ...
success: function(data) {console.log('complete');},
error: function(data) {...}
});
deferreds.push(deferred);
});
$.when.apply($, deferreds).done(console.log('done'));
});
});
当上面的 运行 代码(更多详细信息请参见 fiddle)并检查我的 console.log 它显示 'done' 发生在任何 'completes' 之前(下图)
请帮助我理解代码有什么问题。我希望在 console.log('done')
之前对 console.log('complete')
的所有 ajax 调用。据我了解,这就是 $.when.apply
.
的意义所在
我已经添加了示例工作代码。请在每个请求中添加承诺
deferred = $.ajax({ ...
success: function(data) {console.log('complete');},
error: function(data) {...}
}).promise();
并更改此行
$.when.apply(this, deferreds)
请运行验证此代码
function doSomething() {
var arrDef = [];
for (var i = 0; i < 2; i++) {
var deferred = $.ajax({
url:"https://jsonplaceholder.typicode.com/todos/1",
type: "GET",
contentType: "application/json;odata=verbose",
success: function(data) {
console.log('complete');
},
error: function(data) {
console.log('fail');
}
}).promise();
arrDef.push(deferred);
}
return arrDef;
}
var getters = doSomething();
// use apply to call $.when
$.when.apply(this, getters).then(function() {
console.log('Final complete');
// correctly writes out all responses
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
我正在尝试了解有关 ajax 调用的更多信息并进行一些测试。由于异步,我 运行 陷入了困境。在 this website 的帮助下,我找到了我认为应该有效的东西。不知何故,事情仍然 运行 不正确。我摆弄了很多东西,但仍然没有让事情按照我喜欢的方式工作。
背景:
- 在
array
中捕获可变数量的 ID
- 通过
$.ajax
调用迭代以更新 ID(api 无法进行批处理请求)。
$(document).ready(function() {
$("#button").click(function() {
var deffered, deferreds = [];
$.each(arr, function(i, array) {
deferred = $.ajax({ ...
success: function(data) {console.log('complete');},
error: function(data) {...}
});
deferreds.push(deferred);
});
$.when.apply($, deferreds).done(console.log('done'));
});
});
当上面的 运行 代码(更多详细信息请参见 fiddle)并检查我的 console.log 它显示 'done' 发生在任何 'completes' 之前(下图)
请帮助我理解代码有什么问题。我希望在 console.log('done')
之前对 console.log('complete')
的所有 ajax 调用。据我了解,这就是 $.when.apply
.
我已经添加了示例工作代码。请在每个请求中添加承诺
deferred = $.ajax({ ...
success: function(data) {console.log('complete');},
error: function(data) {...}
}).promise();
并更改此行
$.when.apply(this, deferreds)
请运行验证此代码
function doSomething() {
var arrDef = [];
for (var i = 0; i < 2; i++) {
var deferred = $.ajax({
url:"https://jsonplaceholder.typicode.com/todos/1",
type: "GET",
contentType: "application/json;odata=verbose",
success: function(data) {
console.log('complete');
},
error: function(data) {
console.log('fail');
}
}).promise();
arrDef.push(deferred);
}
return arrDef;
}
var getters = doSomething();
// use apply to call $.when
$.when.apply(this, getters).then(function() {
console.log('Final complete');
// correctly writes out all responses
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>