检测Javascript何时执行

时间:2011-10-31 18:24:26

标签: javascript ajax

javascript中是否有一个事件可以绑定某种类型的侦听器,告诉我什么时候在页面上执行所有javascript / jQuery / Ajax?在执行开始的时间和我需要监听器“监听”的时间之间,页面将不会加载/卸载/重新加载等,因此这些事件不起作用。该页面实际上没有做任何事情。单击该按钮并激活一些包含对Web服务的Ajax调用的javascript函数。毕竟,我想改变window.location。但是在我的情况下,在web服务完成之前,window.location正在发生变化。

目前使用setTimeout来实现这一点,但是有时代码需要比正常情况更多的时间来运行,有时window.location在所有其他javascript完成之前触发。简单地说

<input type = "button"... onclick="doThis();";

function doThis() {
   try{
      //Contains AJAX calls to web services which is mainly what screws up my timing since it may still be trying to execute stuff when the redirect statement happens
      }
   catch (e) {
      }
  //Currently doing setTimeout(redirect, 10000);
  //Would like to simply detect when all of the above is done and then redirect.  
}

编辑:遗漏了一条至关重要的信息。 AJAX调用处于for循环中。对我来说变量和成功回调的使用并不是很好,因为在我的成功回调执行时,我的变量在for循环中采用了新值。

5 个答案:

答案 0 :(得分:5)

您要实现的是经典的并发编程问题。它通过使用barrier来解决。

简单来说,你需要:

  1. 计算您已完成的通话次数。
  2. 在所有AJAX完成事件上设置回调。
  3. 使该回调减少调用次数。
  4. 回调检查呼叫次数是否已达到零。如果是,则调用最终代码(此处为redirect)。
  5. 实际的实施留给读者一个练习:)

    提示:将AJAX调用嵌入到处理所有计数器增量和回调设置的函数中。

答案 1 :(得分:3)

我的所作所为:

  • 创建一个表示未完成的AJAX调用次数的变量。
  • 在进行AJAX调用之前,请增加变量。
  • 在完成AJAX调用的代码结束时,调用一个函数(例如ajaxComplete)。
  • ajaxComplete应减少计数。当它达到零时,您就知道所有通话都已完成。

答案 2 :(得分:2)

假设您使用jQuery.ajax,听起来好像在寻找ajaxStop

答案 3 :(得分:1)

为什么不尝试在回调中使用类似Underscore libraryafter函数的内容?

var done = _.after(3, function() {
    window.location = 'http://example.com';
});

$.ajax({
  url: '/tic',
  success: function() {
    done();
  }
});
$.ajax({
  url: '/tac',
  success: function() {
    done();
  }
});
$.ajax({
  url: '/toe',
  success: function( data ) {
    done();
  }
});

答案 4 :(得分:0)

您应该检查来自AJAX调用的响应,并且仅在该响应中进行重定向。这样,当AJAX仍在执行时,您将避免重定向。