angular - 使用 rxjs 将 loadFBX 承诺包装在 observable 中
问题描述
我正在尝试使用threejs 加载一个fbx 文件。但是,除了 onLoad 回调之外,我无法知道何时加载了网格。所以我想使用一个可观察的。我发现 Rxjs 'from' 似乎具有加载 fromPromise 的功能(但包含在 from 中)。
load( url: string, onLoad: ( object: Group ) => void, onProgress?: ( event: ProgressEvent ) => void, onError?: ( event: ErrorEvent ) => void ) : void;
loadFBX = (fileName: string) => {
MeshLoader.loader.load('../../assets/meshes/' + fileName + '.FBX', (object: THREE.Group) => {
});
}
this.d = from(this.meshLoader.loadFBX('polyhedronDivided'));
this.d = from(new FBXLoader().load('../../assets/meshes/' + 'polyhedronDivided' + '.FBX', () => {}));
这些分配都无效。我得到:
ERROR TypeError: You provided 'undefined' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.
我以为我是在为那个功能提供一个承诺......我不知道我在哪里出错了......
更新:更改我的 loadFBX 函数以返回一个 observable 似乎可以解决问题,但我不知道如何创建和返回 observable ......
解决方案
将数据保存到行为主体似乎可以获得所需的结果。
data = new BehaviorSubject<any>(undefined);
loadFBX = (fileName: string) => {
MeshLoader.loader.load('../../assets/meshes/' + fileName + '.FBX',
(object: THREE.Group) => {
this.data.next(object);
});
}
而且你可以像这样订阅,它会在加载完成后返回对象。如果主题未定义,过滤器只是确保代码不会执行。
this.meshLoader.data.pipe(
filter(x => x),
tap(x => { console.log(x); }))
.subscribe();
推荐阅读
- python - 尝试加载“rest_framework.templatetags.rest_framework”时引发 ImportError:无法从“django.utils”导入名称“six”
- javascript - 动态禁用反应形式的下拉菜单
- sql - 根据结果将别名设置为 SQL 列
- autodesk-forge - Forge 查看器优化
- sql-server - 使用窗口函数检查哪些所有记录有重复
- javascript - 如何通过 Fetch API 使用 POST 到 MySql
- reactjs - 使用测试库测试 history.goback 并做出反应
- blazor - 必须读取一个 XML 文件,如何防止它被 OnInitializedAsync 解析两次?
- javascript - OnClick Javascript函数在reactjs中不起作用
- javascript - 从 Google App Script 发送 twilio whatsapp 消息