【发布时间】:2019-11-23 00:23:26
【问题描述】:
所以我有一个流,假设是字母,我需要所有字母按正确的顺序将它们组合成一个单词。一切正常,直到用户更改选项卡、最小化浏览器或切换应用程序 - 行为几乎与我使用 setTimeout() 相同 - 弄乱了订单、丢失物品等。我试图通过使用 bufferWhen() 来实现我的目标、bufferToggle()、takeUntil()、publish() 和 connect() 但没有成功。我也考虑过使用delayWhen,但它已被弃用并且可能不适合,因为它会立即停止流。我应该使用哪些功能以及如何使用?这是我的代码:
export class MyComponent implements AfterViewInit {
private visibilityChange$ = fromEvent(document, 'visibilitychange').pipe(startWith('visible'), shareReplay({ refCount: true, bufferSize: 1 }));
private show$ = this.visibilityChange$.pipe(filter(() => document.visibilityState === 'visible'));
private hide$ = this.visibilityChange$.pipe(filter(() => document.visibilityState === 'hidden'));
public ngAfterViewInit() {
const lettersStream$ = zip( // add delay for each letter
from(['w', 'o', 'r', 'd']),
interval(1000))
// pause when hide$ fires, resume when show$
.pipe(map(([letter, delayTime]) => letter))
.subscribe(console.log);
}
}
我在stackblitz 上做了一个演示 - 我只想看看(当标签处于非活动状态时停止书写)该短语是如何写在屏幕上的。
【问题讨论】:
-
嗯,没有。这些字母是可观察对象发出的连续值,您将它们设为可观察的
of而不是from。我得到“w”,然后 1 秒后下一个字母,除了更改浏览器选项卡造成的中断外,还需要保持顺序。 -
我看不到你是如何在
letterStream$中使用show$和hide$observables 的。我只能看到提到他们的评论。我错过了什么吗? -
这里的实际来源是什么?它是一个在标签改变时断开连接的WebSocket吗?或者它是一个文档事件还是什么?我很困惑是什么导致了这里的问题,或者为什么你需要在可见性变化时暂停这个流
-
源就像例子中一样,Observable 发射值,它没有断开连接,只是浏览器优先考虑可见选项卡,例如“d”项可以在“r”之前处理。
标签: angular typescript asynchronous rxjs rxjs6