jQuery done()似乎在发送请求之前触发

jQuery done()似乎在发送请求之前触发,jquery,ajax,coffeescript,Jquery,Ajax,Coffeescript,我试图在请求完成后隐藏ajax加载程序,但是done()回调会在发出请求之前的blur()事件之后立即触发。我让我的控制器动作睡眠了5秒钟,以确保情况属实,事实确实如此。我认为只有在服务器返回结果后,或者5秒后,才会触发。发生什么事了 $('#order_billing_post_code').on 'blur', -> field = $(this) post_code = field.val() type = field.data 'address-type

我试图在请求完成后隐藏ajax加载程序,但是
done()
回调会在发出请求之前的
blur()
事件之后立即触发。我让我的控制器动作睡眠了5秒钟,以确保情况属实,事实确实如此。我认为只有在服务器返回结果后,或者5秒后,才会触发。发生什么事了

  $('#order_billing_post_code').on 'blur', ->
    field = $(this)
    post_code = field.val()
    type = field.data 'address-type'

    if post_code.length is 8
      xhr = $.ajax
        url: "/address_lookups/new"
        data:
          post_code: post_code
        beforeSend: ->
          field.siblings('i.address-ajax-loader').show()
        success: (data) ->
          parse data, type
        dataType: "json"

      xhr.done(
        alert "done"
      )

我不熟悉这种语法(Coffeescript?),但它看起来像是将调用
alert“done”
的结果立即传递到
xhr.done()
,而不是传递对调用
alert
的函数的引用

尝试:

在vanilla JS中,就好像你写过:

xhr.done(alert("done"))
而不是:

xhr.done(function() {
    alert("done");
});

alert
调用立即发生,结果被传递到
xhr.done
,然后它就没有任何用处了。

为什么不让ajax调用的
alert“done”
触发
complete
?请看一下文档@Nomad101,因为
complete
success
等都是“老派”jQuery。@Alnitak问题是什么?我的意思是,他们仍然像他们应该做的那样工作。仅仅说一句可能是一个简单而有效的解决方案。@Alnitak他们不赞成,不是吗?他们确实仍然有效。就我个人而言,我希望看到它们被弃用,并使promise接口成为唯一受支持的接口。谢谢。就这样。我会尽快接受的。是的,这就是咖啡脚本。
xhr.done(function() {
    alert("done");
});