Javascript执行异常

Javascript executing out of order

本文关键字:异常 执行 Javascript      更新时间:2023-09-26

我正在用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();

我请求加载程序加载我的cornell box数据,但由于某种原因,它直到执行完所有其他代码后才完成加载。当我使用调试器进行调试时,加载程序将解析文件位置,但随后,它将直接跳到我的for循环中,而不是将数据实际加载到我的"meshlist"数组中,该循环将meshlist数据放置到我的元素数组中。由于没有任何东西被加载到meshlist中,所以这显然并没有起到多大作用。只有在执行完所有其他代码之后,加载程序才会从停止的地方重新开始,并完成对meshlist的加载。可能是什么原因造成的?我不知道。感谢您的投入!

由于loader.load的异步性,您面临这个问题。它发出http请求,当您的资源从服务器转移到客户端时,其余代码将执行。正如您在文档中看到的,您需要将callback函数传递给load方法,当您的资源完成加载时将调用该方法

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