如何跨两个外部 JS 文件同步访问全局变量
How can I synchronize accessing a global var across two external JS files
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' 是 'undefined'...
如何在两个 javascript 文件上同步 'a'?
忙等待不起作用的原因是 JavaScript 在浏览器上只有一个 main 线程,所以忙等待阻止了代码 test1.js
从 运行。一般来说,忙等待几乎不是一个好主意,在基于浏览器的 JavaScript 中基本上也不是一个好主意。 :-)
理想情况下,这两个文件会提供一种在它们之间进行同步的有意方式。
但是如果没有 test2.js
可以使用的事件,并且如果等到 a
的值不是 undefined
绝对正确的话,您可以使用 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();
});
尝试将 $(document).ready(function(){
替换为 $(window).load(function(){
或者您可以使用 js window.load=function(){
。这将等待所有 html、css 和 js 加载,然后在该函数中执行脚本代码。
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' 是 'undefined'... 如何在两个 javascript 文件上同步 'a'?
忙等待不起作用的原因是 JavaScript 在浏览器上只有一个 main 线程,所以忙等待阻止了代码 test1.js
从 运行。一般来说,忙等待几乎不是一个好主意,在基于浏览器的 JavaScript 中基本上也不是一个好主意。 :-)
理想情况下,这两个文件会提供一种在它们之间进行同步的有意方式。
但是如果没有 test2.js
可以使用的事件,并且如果等到 a
的值不是 undefined
绝对正确的话,您可以使用 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();
});
尝试将 $(document).ready(function(){
替换为 $(window).load(function(){
或者您可以使用 js window.load=function(){
。这将等待所有 html、css 和 js 加载,然后在该函数中执行脚本代码。