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加载,然后在该功能中执行脚本代码。