gpt4 book ai didi

javascript - 使用 LABjs 的错误执行顺序

转载 作者:行者123 更新时间:2023-11-29 19:56:21 26 4
gpt4 key购买 nike

我做了一个非常简单的示例(改编 self 的真实项目),它使用 LABjs (v2.0.3) 加载 javascript 文件并按给定顺序执行它们。我正在粘贴下面的代码。

  • 由于 testLAB.js 等待 mainCanvas.js,而 mainCanvas.js 等待 events.js,我希望警报的顺序是:“events.js”“mainCanvas.js”“testLAB.js”。
  • 但是,我得到的通常是相反的顺序:“testLAB.js”“mainCanvas.js”“events.js”。
  • 有时我得到“testLAB.js”“events.js”“mainCanvas.js”。

谁能解释一下?
完整示例可以下载here .

编辑:我正在使用 node.js 和 http-server module在本地提供这些页面(以防您也想在本地尝试)

文件:index.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Test lab.js</title>
<script src="js/lib/LAB.js"></script>
<script src="js/app/testLAB.js"></script>
</head>
<body>
</body>
</html>

文件:js/app/testLAB.js

$LAB.setGlobalDefaults({
BasePath: "/js/",
Debug:true
});

$LAB
.script("lib/underscore.min.js")
.script("app/mainCanvas.js").wait(function(){
alert("testLAB.js");
});

文件:js/app/mainCanvas.js

$LAB
.script("lib/jquery.js").wait()
.script("lib/underscore.min.js")
.script("app/events.js")
.wait(function() {
alert("mainCanvas.js");
});

文件:js/app/events.js

$LAB
.script("lib/jquery.js")
.script("lib/underscore.min.js")
.wait(function() {
alert("events.js");
});

最佳答案

这里的问题是对 LABjs 的工作方式,或者更确切地说,是对嵌套动态脚本加载的工作方式的误解。

如果我使用脚本加载器加载脚本 A.js,浏览器将下载并执行该脚本的内容,在脚本 A 中,我使用脚本加载器加载脚本 B.js,脚本的事实A.js 要求加载 B.js 并不意味着 A.js 的“加载”事件被神奇地阻止,直到依赖项(即在本例中为 B.js)完成加载和执行。

一旦脚本加载完毕,浏览器就会立即执行它,一旦它的主要执行完成,浏览器就会在该脚本上触发“加载”事件,表明它已完成。如果该脚本激发了一些其他异步行为,例如加载更多脚本,则该异步行为将不会影响主执行线程或该脚本的“加载”事件的激发。

如果您需要加载嵌套的依赖项,您将需要一个更复杂的系统来“延迟”每个文件的执行,类似于 AMD 加载程序(如 Require.js)将所有代码包装在函数中的方式。该技术起作用的原因是声明的外部函数的执行顺序无关紧要,因为在定义所有代码之后,您可以返回并以各种正确的顺序执行这些函数有效负载并获得您期望的顺序。


如果您不想走 AMD/Require 路线,我个人的另一个(更简单?)选项是使用一个简单的构建工具脚本,该脚本在构建时读取您的 JS 文件,发现所有嵌套的依赖项是什么,并以正确的顺序将所有这些依赖项“提升”到单个“全局”$LAB 链调用中。因此,在您的文件中,不要使用实际的 $LAB 调用来声明嵌套依赖关系,只需对依赖关系进行标记,例如在 JS 注释中,然后让您的脚本查找这些依赖关系。

示例(类似于我自己做事的方式):

A.js:

// needs "B.js"
// needs "C.js"

A.something = function( /*..*/ ) { /*..*/ };
B.something();
C.something();

B.js:

// needs "D.js"

B.something = function( /*..*/ ) { /*..*/ };
D.something();

C.js:

// needs "D.js"
// needs "E.js"

C.something = function( /*..*/ ) { /*..*/ };
D.something();
E.something();

D.js:

D.something = function( /*..*/ ) { /*..*/ };

E.js:

E.something = function( /*..*/ ) { /*..*/ };

然后,我有一个简单的脚本来查看我的文件,并发现必要的执行顺序以满足所有依赖项。

然后它会生成一个 $LAB 链供我的主页使用,如下所示:

$LAB
.script("D.js")
.script("E.js").wait() // D and E can execute in either order
.script("B.js")
.script("C.js").wait() // B and C can execute in either order
.script("A.js")
.wait(function(){
alert("Everything is loaded!");
});

对于我建议的方法,唯一需要注意的是您不能进行循环依赖(例如 C 依赖于 B,B 依赖于 C)。如果您需要循环依赖,请转到 AMD/Require.js。

关于javascript - 使用 LABjs 的错误执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15973784/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com