我有 2 个 javascript 文件。让我们称之为 script1.js 和 script2.js。我想确保它们按顺序执行(首先是 script1.js,然后是 script2.js)。所以我将它们的 async 属性都设置为 false 。然而,在特定情况下,这不会发生。如果 script1 包含同步 xhr 调用,则执行顺序颠倒,首先执行 script2,然后执行 script1。我打开了一个针对 firefox 的错误,但他们说 sync xhr 调用再次旋转事件循环,因此即使第一个脚本尚未完成,它仍会开始执行第二个脚本。我无法避免在 javascript 文件中同步 xhr。以前有人遇到过这个问题吗?请让我知道是否有任何替代方法可以执行此操作或确保 javascript 文件执行顺序。
这是可以尝试的示例。
以下是在 oder 中加载 script1 和 script2 的 javascript 方法。
function loadJavascript() {
var script1 = document.createElement("script");
script1.async=false;
script1.src = "/html/js/script1.js";
script1.finished = false;
script1.onload = script1.onreadystatechange = function() {
if ((script1.readyState && script1.readyState != "complete" && script1.readyState != "loaded") || script1.finished) return;
script1.onload = script1.onreadystatechange = null;
console.log("script1 finished executing");
script1.finished =true;
};
var script2 = document.createElement("script");
script2.async=false;
script2.src = "/html/js/script2.js";
script2.finished = false;
script2.onload = script2.onreadystatechange = function() {
if ((script2.readyState && script2.readyState != "complete" && script2.readyState != "loaded") || script2.finished) return;
script2.onload = script2.onreadystatechange = null;
console.log("script2 finished executing");
script2.finished =true;
};
var head = document.head;
head.appendChild(script1);
head.appendChild(script2);
}
script1.js
(function(){
console.log("script1 evaluating");
var http = new XMLHttpRequest();
http.open('GET', '/html/js/script3.js', false);
var data = http.send(null);
eval(http.responseText);
})();
script2.js
(function(){
console.log("script2 evaluating");
})();
script3.js
(function(){
})();
实际结果:
第一次执行顺序是正确的。我在萤火虫中看到以下内容
script1 evaluating
GET http://10.194.176.9/html/js/script3.js
script1 finished executing
script2 evaluating
script2 finished executing
但是第二次以后,一旦所有脚本都被缓存,我总是会看到以下顺序。在这里你会看到 script2 和 script1 的执行顺序是相反的。
script1 evaluating
GET http://10.194.176.9/html/js/script3.js
script2 evaluating
script2 finished executing
script1 finished executing
预期成绩:
script1 和 script2 的执行顺序不应该颠倒,因为我使用的是 async=false。