Angular 6 rxjs observable 在 next() 时不提醒
Angular 6 rxjs observable not alert when next()
我用打字稿为我的游戏构建了一个加载系统。我有一些图层:游戏 > 场景 > 元素 > 精灵 > html 带有加载事件的图像。全部通过 observable 等待。
首先我有一个包含多个 html 图像的精灵所以我有一个加载函数
public load(): Observable<boolean> {
this.loadingObs = new Observable((observer) => {
const layerNames = Object.keys(this.conf.layers);
let nLayer: number = 0;
layerNames.forEach((k) => {
this.loadImage(k).subscribe((loadResult) => {
if (loadResult) {
nLayer++;
}
if (nLayer === layerNames.length) {
this.loaded = true;
observer.next(true);
observer.complete();
}
});
});
});
return this.loadingObs;
}
以及一种检索可观察对象的方法
public getLoadingObs(): Observable<boolean> {
return this.loadingObs;
}
想法是:如果有 N 个元素想要加载相同的 Sprite,我会为我的图像加载事件创建一个可观察对象,存储可观察对象并为下一个想要它的元素提供可观察对象。因此,当图像加载完成后,所有元素都会通过可观察订阅接收到 'notification'。有效。
About Game > Scenes > Elements > Sprites,都是关于机制的,比如
public load(): Observable<boolean> {
return new Observable((observer) => {
let nRefs = 0;
const spriteRefs = this.getSpritesRefs();
// Load all needed sprites
spriteRefs.forEach((ref) => {
this.resources.loadSprite(ref).subscribe((loadFinished) => {
if (loadFinished) {
nRefs++;
}
if (nRefs === spriteRefs.length) {
this.afterLoadInit();
observer.next(true);
observer.complete();
}
});
});
});
}
我的 loadSprite 服务函数从 sprite 获取新的 observable 或像之前解释的那样检索它。但是我只会在创建和订阅时收到通知,而在检索和订阅时不会收到通知。 (它之前有效)
所以图像加载是可以的,一些通过所有层观察到的通信很好,但不是全部。因此,如果我等待 26 个加载状态,我会收到 5 个(5 个实际负载),那么为什么 sudently observable 没有像以前那样将 next() 函数传播给所有订阅者?
我迷路了,我不知道可以更轻松地调试 observable 的工具或技术。我尝试了 tap/do 方法但没有成功。和 console.log 是异步的混合原因。
提前感谢您的帮助或建议
解决方案是使用 eventEmitter 而不是 observable。更多关于广播问题的建议。
我用打字稿为我的游戏构建了一个加载系统。我有一些图层:游戏 > 场景 > 元素 > 精灵 > html 带有加载事件的图像。全部通过 observable 等待。
首先我有一个包含多个 html 图像的精灵所以我有一个加载函数
public load(): Observable<boolean> {
this.loadingObs = new Observable((observer) => {
const layerNames = Object.keys(this.conf.layers);
let nLayer: number = 0;
layerNames.forEach((k) => {
this.loadImage(k).subscribe((loadResult) => {
if (loadResult) {
nLayer++;
}
if (nLayer === layerNames.length) {
this.loaded = true;
observer.next(true);
observer.complete();
}
});
});
});
return this.loadingObs;
}
以及一种检索可观察对象的方法
public getLoadingObs(): Observable<boolean> {
return this.loadingObs;
}
想法是:如果有 N 个元素想要加载相同的 Sprite,我会为我的图像加载事件创建一个可观察对象,存储可观察对象并为下一个想要它的元素提供可观察对象。因此,当图像加载完成后,所有元素都会通过可观察订阅接收到 'notification'。有效。
About Game > Scenes > Elements > Sprites,都是关于机制的,比如
public load(): Observable<boolean> {
return new Observable((observer) => {
let nRefs = 0;
const spriteRefs = this.getSpritesRefs();
// Load all needed sprites
spriteRefs.forEach((ref) => {
this.resources.loadSprite(ref).subscribe((loadFinished) => {
if (loadFinished) {
nRefs++;
}
if (nRefs === spriteRefs.length) {
this.afterLoadInit();
observer.next(true);
observer.complete();
}
});
});
});
}
我的 loadSprite 服务函数从 sprite 获取新的 observable 或像之前解释的那样检索它。但是我只会在创建和订阅时收到通知,而在检索和订阅时不会收到通知。 (它之前有效)
所以图像加载是可以的,一些通过所有层观察到的通信很好,但不是全部。因此,如果我等待 26 个加载状态,我会收到 5 个(5 个实际负载),那么为什么 sudently observable 没有像以前那样将 next() 函数传播给所有订阅者?
我迷路了,我不知道可以更轻松地调试 observable 的工具或技术。我尝试了 tap/do 方法但没有成功。和 console.log 是异步的混合原因。
提前感谢您的帮助或建议
解决方案是使用 eventEmitter 而不是 observable。更多关于广播问题的建议。