如何同步在两个外部JS文件中访问全局var



test.html

<html>
    <head>
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
        <script src = "./test1.js"></script>
        <script src = "./test2.js"></script>
    </head>
</html>

test1.js

var a;
$(document).ready(function(){
    setTimeout(function(){
        a=10;   
    },1000);
});

test2.js

$(document).ready(function(){
    //Busy waiting... doesn't Work.
    /*while(typeof(a) === "undefined"){
        console.log(a);
    };*/
    console.log(a);
});

test2打印'a'是"未定义" ...如何在两个JavaScript文件上同步" A"?

忙碌等忙碌的原因是,浏览器上的javaScript只有一个 main 线程,因此忙碌的等待者正在从test1.js中避免使用CC_1的代码曾经跑步。总体而言,忙碌几乎从来都不是一个好主意,从本质上讲,在基于浏览器的JavaScript中,忙碌从来都不是一个好主意。: - )

理想情况下,这两个文件将提供一种有意的方法来同步它们。

但是,如果没有test2.js可以使用的事件,并且如果等待a的值肯定是正确的,则可以使用setTimeout循环:

test2.js

$(document).ready(function(){
    function checkForA() {
        if (typeof a === "undefined") {
            // Keep waiting
            setTimeout(checkForA, 10); // 50 = 50 milliseconds
        } else {
            // Got it
            console.log(a);
        }
    }
    checkForA();
});

如果可以使用test1.js中的某种通知避免此超时循环,那就更好了;但是在最坏的情况下,每50毫秒左右进行一次投票并不重要。在某个时候放弃它可能是个好主意:

$(document).ready(function(){
    var started = Date.now();
    function checkForA() {
        if (typeof a === "undefined") {
            // Still don't have it, keep waiting?
            if (Date.now() - start > 10000) { // More than 10 seconds
                // Give up
                console.log("Gave up waiting for a");
            } else {
                setTimeout(checkForA, 10); // 50 = 50 milliseconds
            }
        } else {
            // Got it
            console.log(a);
        }
    }
    checkForA();
});

尝试用$(window).load(function(){替换$(document).ready(function(){,也可以使用JS window.load=function(){。这将等待所有HTML,CSS和JS加载,然后在该功能中执行脚本代码。

相关内容

  • 没有找到相关文章

最新更新