延迟对象回调挂钩的JQuery执行顺序(承诺与完成)
我有一个本地托管的项目,其视图向服务器发出AJAX请求。代码在SAN中复制,URL和数据参数用JSFIDLE测试数据代替,以模拟AJAX请求延迟对象回调挂钩的JQuery执行顺序(承诺与完成),jquery,ajax,jquery-deferred,Jquery,Ajax,Jquery Deferred,我有一个本地托管的项目,其视图向服务器发出AJAX请求。代码在SAN中复制,URL和数据参数用JSFIDLE测试数据代替,以模拟AJAX请求 (function demo(iteration) { count = iteration || 0; if (count < 3) { $.when(testPromise(count).promise()) .done(function () { doSomething();
(function demo(iteration) {
count = iteration || 0;
if (count < 3) {
$.when(testPromise(count).promise())
.done(function () {
doSomething();
})
.always(function () {
demo(count + 1);
});
}
})();
function doSomething() {
console.log("something!");
}
function testPromise(iteration) {
var deferred = $.ajax({
type: 'POST',
url: '/echo/json/',
data: {
json: JSON.stringify({ "data": "Data!" }),
delay: 0.1
},
dataType: 'json',
beforeSend: function () {
console.log("Before Send: " + iteration);
},
success: function(response) {
console.log("Success: " + iteration);
},
error: function() {
console.log("Error: " + iteration);
},
complete: function () {
console.log("Complete: " + iteration);
}
});
return deferred;
}
jQuery Deferred在版本3.0()中更新,因此确保您的jQuery版本与fiddle(3.2.1)上的版本相同可能会有所帮助。ajax是异步的。服务器可能会影响接收响应的顺序,这可能是您在JSFIDLE中获得与您自己的服务器不同结果的原因,虽然我不希望服务器响应在这种情况下起作用,因为每个后续请求都依赖于前一个请求的已解析延迟对象。因此,在任何给定的时间,b/c只有一个ajax请求的延迟对象状态为“挂起”,服务器应该是无关的。如果我错了,请纠正我,但我感谢你的意见!如果是这样的话,那么服务器的响应是不相关的。你能在你的问题中提供相关的代码吗?一切都是这样的假设两个位置使用相同版本的jquery,我无法解释为什么在这种情况下一个位置会给出不同的结果。嗯,是的,我没有预料到版本控制会成为一个问题,因为延迟对象文档没有提到从2.X到3.X的机制更改,但是你是绝对正确的。我的环境是2.2版本的,当我将JSFIDLE下载到2.4版本时,它的行为与我的本地代码库完全相同。我真傻。谢谢你的回复
$.when(testPromise(count).promise())
.done(function () {
doSomething();
})
.always(function () {
demo(count + 1);
});