簡體   English   中英

JS函數參數+ Three.js

[英]JS function parameters + Three.js

我有2個參數的對象-Obj3D,名稱,我想按名稱加載對象:

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。

如果loader.load是異步的,則不要期望在函數調用后立即填充該對象。 換一種說法:

load3DObjectByName(obj, loader);
//obj might not be ready yet.

改用Promise或繼續使用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.
});

正如MinusFour指出的,loader.load是異步的。 這意味着-代碼將按以下方式執行

loader.load(..., youranonymousfunctionReference)
window.alert(...
// and then from eventloop
youranonymousfunctionReference.

因此,在調用window.alert時,匿名函數尚未執行,因此未定義Obj。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM