【问题标题】:Synchronize window.setTimeout callback同步 window.setTimeout 回调
【发布时间】:2012-05-22 01:50:31
【问题描述】:
setTimeout(function() {
    console.log("1");
}
console.log("2");

基本上,我想在“2”之前输出“1”。如何将回调函数与当前的“调用者”线程同步?

【问题讨论】:

    标签: javascript synchronization settimeout


    【解决方案1】:

    您无法在 JavaScript 中阻止线程(alertconfirm 内置函数除外),因此使您的 console.log("2") 在您的 console.log("1") 之后发生的唯一方法是:

    1. 放到超时函数中:

      setTimeout(function() {
          console.log("1");
          console.log("2");
      }, delay);
      

      ...或在该超时函数调用的另一个函数中,尽管您已经有一个用于 setTimeout 的函数,但不清楚(除了代码组织)为什么需要一个单独的函数。

    2. 把它放在你传递给setTimeout的一个单独的函数中,延迟时间更长:

      setTimeout(function() {
          console.log("1");
      }, delay);
      setTimeout(function() {
          console.log("2");
      }, longerDelay);
      

      ...请注意longerDelay 确实比delay 长得多,这样您就不会在日程安排方面遇到一点混乱。

    注意我在上面说的是“线程”。除非您使用具有特定语法的 web workers,否则浏览器上的 JavaScript 是单线程。两个 JavaScript 函数不能同时运行,除了围绕 alert 和 ajax 完成等的边缘情况浏览器错误(至少某些版本的 Firefox 运行您的 ajax 完成回调,而您有一个函数等待 alert;奇怪但真实,并且没有任何东西可以依赖跨浏览器甚至跨版本),您不能在运行另一个 JavaScript 函数时暂停一个 JavaScript 函数。

    【讨论】:

    • 感谢您如此详细的回复。我真正在做的是为异步函数编写 QUnit 测试用例。我有一堆测试用例,每个测试用例都有异步函数调用。但是当我调试时,直到所有同步代码都没有完成,才会执行异步调用。但是我想同步完成每个测试用例,包括它的同步和异步代码。
    【解决方案2】:

    尝试类似:

    setTimeout(function() {
        console.log("1");
        callback();
    }
    function callback(){
       console.log("2");
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多