2013-05-11 85 views
3

在请求完成后,我试图隐藏ajax加载器,但done()回调在blur()事件之后立即触发,然后发出请求。我让我的控制器动作睡了5秒,以确定是这种情况,而且是这样。我认为它应该只在结果从服务器返回后或5秒钟后触发。这是怎么回事?jQuery done()似乎在发送请求之前触发

$('#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" 
    ) 
+0

为什么没有'alert'完成''在ajax调用的'complete'上触发?看看文档http://api.jquery.com/jQuery.ajax/ – Nomad101 2013-05-11 22:32:57

+0

@ Nomad101,因为'complete','success'等是“老派”的jQuery。 – Alnitak 2013-05-11 22:33:44

+0

@Alnitak和问题是?我的意思是他们仍然按照他们应该的方式工作只是说可能是一个简单而有效的解决方案。 – Nomad101 2013-05-11 22:34:26

回答

6

我不熟悉这个语法(CoffeeScript的?),但它看起来像你通过立即调用alert "done"xhr.done()的结果,而不是传递参照功能调用alert

尝试:

xhr.done -> 
    alert "done" 

在香草JS,这是因为如果你这样写:的

xhr.done(alert("done")) 

代替:

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

alert调用立即发生,而结果传递给xhr.done,然后它根本没有任何用处。

+0

谢谢。而已。我会尽快让我接受。是的,那就是CoffeeScript。 – dee 2013-05-11 22:34:42

相关问题