gpt4 book ai didi

Javascript 乱序执行

转载 作者:行者123 更新时间:2023-11-30 17:04:07 27 4
gpt4 key购买 nike

我正在用 javascript 制作一个路径追踪器,但我遇到了一个非常奇怪的错误。这是我的代码的相关部分(它下面有更多代码,但我认为它不会引起任何问题。如果我将其全部注释掉,则会出现相同的结果):

<html>
<head>
<script src="lib/sah.js"></script>
<script src="lib/BIH.js"></script>
<script src="lib/Three.js"></script>
<script src="lib/three.min.js"></script>
<script src="lib/loaders/OBJMTLLoader.js"></script>
<script src="lib/loaders/MTLLoader.js"></script>
<script src="lib/loaders/XHRLoader.js"></script>
<script src="lib/loaders/Cache.js"></script>

<script type="text/javascript">
function Vec(x, y, z) { return new V(x, y, z); }
function V(x, y, z) { this.x = x; this.y = y; this.z = z; }
V.add = function (a, b) { return Vec(a.x + b.x, a.y + b.y, a.z + b.z); } // overriding operators is not possible in JS
V.sub = function (a, b) { return Vec(a.x - b.x, a.y - b.y, a.z - b.z); }
V.mud = function (a, b) { return Vec(a.x * b, a.y * b, a.z * b); }
V.prototype.mult = function (b) { return Vec(this.x * b.x, this.y * b.y, this.z * b.z); }
V.prototype.norm = function () { var t = this; var il = 1 / Math.sqrt(t.x * t.x + t.y * t.y + t.z * t.z); t.x *= il; t.y *= il; t.z *= il; return t; }
V.prototype.dot = function (b) { return this.x * b.x + this.y * b.y + this.z * b.z; }
V.crs = function (a, b) { return Vec(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x); }


function Element(aabb,material) {
this.aabb = aabb;
this.material = material;
}
var meshlist = [];

var elements = [];
var loader = new THREE.OBJMTLLoader();
loader.load("lib/CornellBox-Sphere.obj", "lib/CornellBox-Sphere.mtl", meshlist);
for (k = 0; k < this.meshlist.length; k++) {
for (l = 0; l < this.meshlist[k].geometry.aabb.length; l++) {
elements.push(new Element(this.meshlist[k].geometry.aabb[l],meshlist[k].material));
}
}

var bih = new BIH();

我正在请求加载程序加载我的康奈尔盒子数据,但出于某种原因,它直到所有其他代码都已执行后才完成加载。当我使用调试器逐步执行它时,加载程序将解析文件位置,但随后它不会将数据实际加载到我的“meshlist”数组中,而是直接跳到我的 for 循环中,将 meshlist 数据放入我的元素数组中。由于没有任何东西被加载到 meshlist 中,这显然没有多大作用。只有在执行完所有其他代码后,加载程序才会从它停止的地方开始并完成加载到 meshlist 中。可能是什么原因造成的?我不知道。感谢您的意见!

最佳答案

您遇到此问题是因为 loader.load 的异步特性。它发出 http 请求,当您的资源从服务器传输到客户端时,您的其余代码将执行。正如您在 documentation 中看到的那样您需要将 callback 函数传递给 load 方法,该方法将在您的资源加载完成时调用

loader.load("lib/CornellBox-Sphere.obj", "lib/CornellBox-Sphere.mtl", function (obj) {
// do your resources dependant stuff here
});

关于Javascript 乱序执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28320713/

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