延迟对象回调挂钩的JQuery执行顺序(承诺与完成)

延迟对象回调挂钩的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();

我有一个本地托管的项目,其视图向服务器发出AJAX请求。代码在SAN中复制,URL和数据参数用JSFIDLE测试数据代替,以模拟AJAX请求

(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);
    });