JS函数参数+ Three.js

时间:2015-08-19 02:27:36

标签: javascript three.js

我有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。

2 个答案:

答案 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未定义。