Javascript 设置超时和同步

Javascript 设置超时和同步,javascript,Javascript,具有以下代码: <script type="text/javascript" src="script.js"></script> <script type="text/javascript" src="script2.js"></script> script2.js: setTimeout(function(){ console.log("second"); }, 10); 运行它时,我得到了不同的结果。一次输出为: second fi

具有以下代码:

<script type="text/javascript" src="script.js"></script>
<script type="text/javascript" src="script2.js"></script>
script2.js:

setTimeout(function(){
    console.log("second");
}, 10);
运行它时,我得到了不同的结果。一次输出为:

second
first
但另一次:

first
second

由于给定的时间延迟,它不应该总是“第二,第一”顺序吗?

我有三种方法来解决你的问题

  • 在第二个函数中调用第一个函数

    function first(){
        second();
        setTimeout(function(){
            console.log("first");
        }, 10);
    }
    
    function second(){
        setTimeout(function(){
            console.log("second");
        }, 10);
    }
    
    function first(){
        setTimeout(function(){
            console.log("first");
        }, 11);
    }
    
    function second(){
        setTimeout(function(){
            console.log("second");
        }, 10);
    }
    
  • 只需给第一个函数多一点间隔

    function first(){
        second();
        setTimeout(function(){
            console.log("first");
        }, 10);
    }
    
    function second(){
        setTimeout(function(){
            console.log("second");
        }, 10);
    }
    
    function first(){
        setTimeout(function(){
            console.log("first");
        }, 11);
    }
    
    function second(){
        setTimeout(function(){
            console.log("second");
        }, 10);
    }
    
  • 使用标志

    var flag = false; //global variable
    
    function first(){
        setTimeout(function(){
            if(flag){
                console.log("first");
            }else{
                first();
            }
        }, 10);
    }
    
    function second(){
        flag = true;
        setTimeout(function(){
            console.log("second");
        }, 10);
    }
    

  • 我有三种方法来解决你的问题

  • 在第二个函数中调用第一个函数

    function first(){
        second();
        setTimeout(function(){
            console.log("first");
        }, 10);
    }
    
    function second(){
        setTimeout(function(){
            console.log("second");
        }, 10);
    }
    
    function first(){
        setTimeout(function(){
            console.log("first");
        }, 11);
    }
    
    function second(){
        setTimeout(function(){
            console.log("second");
        }, 10);
    }
    
  • 只需给第一个函数多一点间隔

    function first(){
        second();
        setTimeout(function(){
            console.log("first");
        }, 10);
    }
    
    function second(){
        setTimeout(function(){
            console.log("second");
        }, 10);
    }
    
    function first(){
        setTimeout(function(){
            console.log("first");
        }, 11);
    }
    
    function second(){
        setTimeout(function(){
            console.log("second");
        }, 10);
    }
    
  • 使用标志

    var flag = false; //global variable
    
    function first(){
        setTimeout(function(){
            if(flag){
                console.log("first");
            }else{
                first();
            }
        }, 10);
    }
    
    function second(){
        flag = true;
        setTimeout(function(){
            console.log("second");
        }, 10);
    }
    

  • 你有一个简单的比赛条件

    规范保证脚本文件按顺序运行。这意味着浏览器可以尝试同时下载文件,但即使在script.js之前加载script2.js,script.js也会首先运行


    但是,如果script.js加载速度很快,并且在script2.js仍在从服务器下载时执行,则在执行script2.js之前至少有5毫秒的时间。如果发生这种情况,将首先执行script.js中的超时,输出将是
    first,second

    您有一个简单的竞争条件

    规范保证脚本文件按顺序运行。这意味着浏览器可以尝试同时下载文件,但即使在script.js之前加载script2.js,script.js也会首先运行


    但是,如果script.js加载速度很快,并且在script2.js仍在从服务器下载时执行,则在执行script2.js之前至少有5毫秒的时间。如果发生这种情况,script.js中的超时将首先执行,输出将是
    第一,第二

    我假设OP想说,他有2个
    设置超时
    ,并希望同步它们。给定,您刚刚在学习,或者这两个问题都是为了解决一个问题——你是否有一个潜在的问题/你想解决的问题?@James Thorpe-更正我假设OP想说,他有2个
    setTimeout
    并想同步它们。既然如此,你只是在学习,或者这两个问题都是试图解决一个问题-你有一个潜在的问题/你想解决的问题吗?@James Thorpe-corrected@James Thorpe:所以浏览器分别下载脚本,在执行同步到第一次运行脚本1和完成脚本2时取消同步线程?@Mulligan81本质上是的。但是,如果script2还没有完成下载,它就无法执行它,同时script1中的超时时间已经在滴答滴答地流逝@James Thorpe:所以浏览器在单独的、不同步的线程中下载脚本,同时执行同步到第一次运行脚本1,当脚本2完成时?@Mulligan81基本上是的。但是,如果script2还没有完成下载,它就无法执行它,同时script1中的超时已经在滴答作响了