同步window.setTimeout回调

时间:2012-05-21 17:12:24

标签: javascript synchronization settimeout

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

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

2 个答案:

答案 0 :(得分:3)

尝试类似:

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

答案 1 :(得分:3)

你不能用JavaScript(alertconfirm内置插件除外)来阻止该线程,因此console.log("2")只能在你的{console.log("1")之后发生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足够长,以至于您不会因调度而陷入混乱。

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