2013-02-08 83 views
0

我已经搜索到处寻找一个解决方案,但迄今还没有找到任何东西(我可能使用了错误的关键字!如果这是重复的,请指出,我会删除)延迟回拨,直到setTimeout完成

难道你们中的一位杰出的SO天才善良地向我解释为什么以下不能如人所愿?我的意思是complete回调在setTimeoutsuccess回调内完成之前调用,我不太明白为什么。

$.ajax({ 
    url: options.url, 
    data: options.data, 
    success: function(){ 
     setTimeout(function(){ 
      console.log('firing'); 
     },2000); 
    }, 
    dataType: options.dataType, 
    complete: function(){ 
     console.log('ended'); 
    } 
}); 

是因为一个新的线程已经通过了setTimeoutsuccess回调中已经启动?

如果不将回调函数传入success回调函数,可以实现这种情况吗?

回答

4

发生这种情况是因为setTimeout()不会阻止代码的执行。

因此,complete回调在与您拨打setTimeout()时没有任何联系的情况下触发。

您必须将您的console.log('ended');调用放入超时(也),或在超时时间内调用完整处理程序。 :)

+0

这很快+1,正如我怀疑! :-(如果回调中没有超时,而是大量代码需要200ms才能完成,那么这会推迟“完成”回调吗?换句话说,这是不是仅仅因为我使用' setTimeout'? –

+0

我必须误读之前...当然,没有超时完成只会在成功产生“我完成”事件后触发。我相信,如果开始思考事件,就可以轻松解决问题。 ;)只需定义并触发你自己的。 –

+0

'complete'回调意味着一旦'success'回调完成就会被调用!那么这怎么会失效呢? –

相关问题