Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 同步window.setTimeout回调_Javascript_Synchronization_Settimeout - Fatal编程技术网

Javascript 同步window.setTimeout回调

Javascript 同步window.setTimeout回调,javascript,synchronization,settimeout,Javascript,Synchronization,Settimeout,基本上,我想在“2”之前输出“1”。如何将回调函数与当前“调用者”线程同步?请尝试以下操作: setTimeout(function() { console.log("1"); } console.log("2"); 尝试以下方法: setTimeout(function() { console.log("1"); } console.log("2"); 您无法在JavaScript中保留线程(除了内置的警报和确认之外),因此使控制台.log(“2”)发生在控制台.log(“

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

请尝试以下操作:

setTimeout(function() {
    console.log("1");
}
console.log("2");
尝试以下方法:

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

您无法在JavaScript中保留线程(除了内置的
警报
确认
之外),因此使
控制台.log(“2”)
发生在
控制台.log(“1”)之后的唯一方法是:

  • 将其置于超时功能中:

    setTimeout(function() {
        console.log("1");
        callback();
    }
    function callback(){
       console.log("2");
    }
    
    …或者在该超时函数调用的另一个函数中,虽然您已经有了一个用于
    setTimeout
    的函数,但不清楚(代码组织除外)为什么需要一个单独的函数

  • 将其放入一个单独的函数中,传递给
    setTimeout
    ,延迟更长:

    setTimeout(function() {
        console.log("1");
        console.log("2");
    }, delay);
    
    …请注意,
    longerDelay
    确实比
    delay
    长得多,这样您就不会在日程安排上出现一些混乱


  • 注意我上面说的是“线”。除非您使用具有特定语法的JavaScript,否则浏览器上的JavaScript是单线程的。两个JavaScript函数不能同时运行,除了围绕
    alert
    和ajax补全等的edge case浏览器错误之外(至少有些版本的Firefox会在函数等待发出警报时运行ajax完成回调;奇怪但真实,而且没有任何东西可以跨浏览器甚至跨版本使用),您不能在另一个JavaScript函数运行时暂停一个JavaScript函数的运行。

    您不能在JavaScript中暂停线程(除了
    警报
    确认
    内置),因此使
    控制台.log(“2”)
    发生在
    控制台.log(“1”)之后的唯一方法是:

  • 将其置于超时功能中:

    setTimeout(function() {
        console.log("1");
        callback();
    }
    function callback(){
       console.log("2");
    }
    
    …或者在该超时函数调用的另一个函数中,虽然您已经有了一个用于
    setTimeout
    的函数,但不清楚(代码组织除外)为什么需要一个单独的函数

  • 将其放入一个单独的函数中,传递给
    setTimeout
    ,延迟更长:

    setTimeout(function() {
        console.log("1");
        console.log("2");
    }, delay);
    
    …请注意,
    longerDelay
    确实比
    delay
    长得多,这样您就不会在日程安排上出现一些混乱


  • 注意,我在上面提到了“线程”。除非您使用的是具有特定语法的JavaScript,否则浏览器上的JavaScript是单线程的。两个JavaScript函数不能同时运行,除了围绕
    alert
    和ajax Completion等的edge case浏览器错误之外(至少有些版本的Firefox会在函数等待发出警报时运行ajax完成回调;奇怪但真实,而且没有任何东西可以跨浏览器甚至跨版本使用),您不能在另一个JavaScript函数运行时暂停一个JavaScript函数的运行。

    感谢您如此详细的回答。我真正要做的是为异步函数编写QUnit测试用例。我有一堆测试用例,每个都有异步函数调用。但当我调试时,似乎在所有同步代码未完成之前,没有异步函数调用调用已执行。但我希望同步完成每个测试用例,包括其同步和异步代码。感谢您如此详细的回复。我真正要做的是为异步函数编写QUnit测试用例。我有一堆测试用例,每个都有异步函数调用。但当我调试时,似乎直到所有同步代码都不可用为止但我想要同步完成每个测试用例,包括它的同步和异步代码。