在javascript中使用setTimeout来模拟php的睡眠

时间:2013-10-25 14:31:37

标签: javascript ajax timing

我有一个AJAX功能,需要一些时间才能完成。完成后,我想打开一个包含结果的新选项卡。为此,我提出了三个选择:

  1. 使用AJAX-call
  2. 中的window.open()
  3. 在javascript函数/事件触发器中使用window.open()。
  4. 在javascript中的setTimeout函数中使用window.open() 功能/事件触发器。
  5. 问题是这必须适用于所有主流浏览器(IE,Chrome,Firefox和Safari),而选项3应该可以解决这个问题但是会产生不必要的副作用:

    1. 在Chrome中,窗口不会在新标签页中打开,而是弹出窗口。
    2. 在Safari中激活内部弹出窗口;导致 没有打开弹出窗口。 (source
    3. 现在我想使用setTimeout()作为一个过程代码,最后得到一些像:

      $('.selector').click(function() { 
        doAjaxCall();
        setTimeout(function(){ }, 150);
        window.open(...);
      });
      

      嗯,这适用于Safari,但Chrome和FireFox似乎忽略了setTimeout()并直接继续使用window.open()。这就是我的问题;

      。当调用window.open()时,必须使用的数据并不总是最新的。

      所以,我在这里。回归本源。弄清楚症状是什么,了解我探索过的场景的缺点并最终得到这样的结果:

      $('.selector').click(function() { 
        doAjaxCall();
        for(i = 0; i <= 100000000; i++) { 
          // procedural and time consuming so doAjaxCall has enough time to complete 
        }
        window.open(...);
      });
      

      在我的情况下,我坚持使用xajax进行ajax处理,所以我不能使用jQuery的ajax解决方案。

      有关如何改善这一点的任何建议?导致所有主流浏览器在ajax-function完成后打开弹出窗口的解决方案?

1 个答案:

答案 0 :(得分:1)

首先,浏览器不会忽略setTimeout函数,但执行不会停止并等待setTimeout完成,但会继续执行并等待超时完成以执行作为参数传递给setTimeout方法的方法。

但是你不需要从php模拟睡眠方法以达到你想要的效果。 ajax调用有一个成功事件,您可以在其上附加事件处理程序。成功事件发生时打开新选项卡。否则,您将无法确切知道ajax请求何时结束。如果你不能使用jquery的ajax,你可以创建一个老式的学校&#39; ajax请求,如here

此外,打开新窗口不是最佳解决方案,因为大多数浏览器都有弹出窗口阻止程序。