我最终选择了 Promise 路线:将 TextureLoader.load() 调用包装在名为 Promise 的 JavaScript 内置 promise-returning 构造函数中:
var loadTexture_promise = ( texture_path, texture_loader ) => {
var texture_promise;
if ( loadTexture_promise.texturePromises_cache[texture_path] !== undefined ) {
return loadTexture_promise.texturePromises_cache[texture_path]
}
texture_promise = new Promise(
function( resolve, reject )
{
texture_loader.load(
texture_path,
function (texture) {
// Success callback of TextureLoader
// We're done, so tell the promise it is complete
resolve(texture);
},
function (XmlHttpRequest_instance) {
// Progress callback of TextureLoader
},
function (unknown_parameter) {
// Failure callback of TextureLoader
// Reject the promise with the failure
reject(new Error('Could not load texture ' + texture_path));
}
);
}
);
// add texture_promise to cache:
loadTexture_promise.texturePromises_cache[texture_path] = texture_promise;
return texture_promise;
};
// establish cache object on the loadTexture_promise function:
loadTexture_promise.texturePromises_cache = [];
然后我有一个lambertMesher 函数,我的几何供应商可以调用它:
function lambertMesher ( aGeometry, aTexture_promise, doubleSided, debug ) {
var aMesh_promise = aTexture_promise.then(
( resolved_texture ) =>
{
var material, mesh;
if ( debug ) {
console.log("resolved_texture: ", resolved_texture);
console.log("aGeometry: ", aGeometry);
}
resolved_texture.minFilter = THREE.NearestFilter;
if (doubleSided) {
material = new THREE.MeshLambertMaterial( { map: resolved_texture, side: THREE.DoubleSide } );
} else {
material = new THREE.MeshLambertMaterial( { map: resolved_texture, emissive: 0xffffff } );
}
mesh = new THREE.Mesh(aGeometry, material);
if ( debug ) {
console.log("mesh: ", mesh);
}
return mesh
},
( reason_of_textureLoading_failure ) =>
{
console.log( "meshing failed. Also: " + reason_of_textureLoading_failure )
}
);
return aMesh_promise
}
最后,我就是这样称呼我的lambertMesher:
var myPlateGeom = new THREE.PlateGeometry( myPlatePolygonSet, true );
var myPlateMesh_promise = utils_meshers.lambertMesher( myPlateGeom, myRobinieTexture_promise, true, false );
然后,最后,我将我的网格添加到我的场景中,如下所示:
myPlateMesh_promise.then(
(myPlateMesh) => { myScene.add( myPlateMesh ) },
(reason) => console.log( "failed to add myPlateMesh. Also: " + reason )
);