Javascript执行异常
Javascript executing out of order
我正在用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
});
相关文章:
- 无法在通过jQuery的ajax加载的页面中执行javascript
- JavaScript执行暂时挂起页面
- 如何在ReactJS JSX中执行嵌套的if-else语句
- 当js函数's已执行
- 哪个先执行
- 在使用Polymer'加载所有json文件后执行方法;s的核心ajax
- HTML表单提交时未执行外部函数
- 在Safari执行javascript之前对其进行修改
- Amd,希望确保某个东西总是最后执行
- 在Windows 10中自动执行例行程序(主要与浏览器交互)
- Meteor:排队任务中出现异常:错误:无法执行'removeChild'在'节点':要
- Javascript执行异常
- 从 C# 执行 JS 代码的异常:预期函数
- 得到“;未捕获的异常:内存不足”;在firebug中执行ajax调用
- 在Nashorn中执行javascript时未发现文件异常
- GhostDriver 在现有元素上执行 javascript 时引发陈旧异常“元素在缓存中不存在”
- wkhtmltopdf转换html到pdf得到JavaScript执行超时异常
- AOP对DB异常执行一个通用的操作
- 如何处理JavaScript中的异常,如果在执行本机java API时抛出任何异常
- RubyonRails控制器执行异常