我有2个参数的对象 - Obj3D,Name和 我想按名称加载对象:
function load3DObjectByName(obj, loader)
{
loader.load(
"resources/3D/meshes.dae",
function(collada) {
obj.Obj = collada.scene.getChildByName(obj.Name, true);
window.alert(obj.Obj["name"]); // obj.Obj != undefined
}
);
window.alert(obj.Obj["name"]); // obj.Obj == undefined
}
但是在加载后,obj.Obj是未定义的... loader = ColladaLoader。
答案 0 :(得分:0)
如果loader.load
是异步的,那么不要期望在函数调用之后立即填充对象。换句话说:
load3DObjectByName(obj, loader);
//obj might not be ready yet.
使用承诺或继续使用CPS。
function load3DObjectByName(obj, loader)
{
return new Promise(function(resolve) {
loader.load(
"resources/3D/meshes.dae",
function(collada) {
obj.Obj = collada.scene.getChildByName(obj.Name, true);
resolve(obj);
}
);
});
}
var prom = load3DObjectByName(obj, loader);
prom.then(function(obj){
//obj here is finished and can be used now.
});
答案 1 :(得分:0)
正如MinusFour所指出的,loader.load是异步的。这意味着 - 代码将被执行为
loader.load(..., youranonymousfunctionReference)
window.alert(...
// and then from eventloop
youranonymousfunctionReference.
所以当调用window.alert时,匿名函数尚未执行,因此Obj未定义。