【发布时间】:2021-11-18 11:36:42
【问题描述】:
delay 的行为在 RxJs 7 中发生了变化。虽然我理解这种变化的原因,但它对于我用来模拟无线 API 延迟的演示项目很有用。在 RxJs 6 中,下面的代码只会在 5 秒延迟后记录到控制台,但在 7 中它会立即记录(7 不再等待空 observable 的延迟)。有没有办法在 RxJs 7 中复制以下内容?
import { EMPTY } from 'rxjs';
import { delay } from 'rxjs/operators';
EMPTY.pipe(delay(5000)).subscribe({
complete: () => {
console.log('complete');
},
});
请参阅下面的 Stackblitz 示例。
RxJs 7(无延迟):https://stackblitz.com/edit/rxjs-yx19nb?file=index.ts RxJS 6(5 秒延迟):https://stackblitz.com/edit/rxjs-8rmhov?file=index.ts
【问题讨论】:
-
为什么它必须是空的?你可以使用 of(null) 作为源流吗?
-
只有当源 Observable 没有发出任何
next并且刚刚完成时,才会出现此错误。我记得是因为我自己修好了 :) github.com/reactivex/rxjs/issues/4249 和 PR github.com/ReactiveX/rxjs/pull/4444 -
EMPTY.pipe(delay(5000))在 5 秒后发射听起来对我来说也是一个错误。当一个 observable 发出complete通知时,我希望它立即完成并且只支持特定的运算符,例如finalize。延迟complete可能会导致意想不到的后果。至于您的原型设计方案,我强烈建议您改用timer(5000)或of().pipe(delay(5000))之类的东西。