【问题标题】:How to replicate delay from RxJs 6.x?如何从 RxJs 6.x 复制延迟?
【发布时间】: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)) 之类的东西。

标签: rxjs rxjs7


【解决方案1】:

只需使用计时器即可。

timer(5000).pipe(
  ignoreElements()
).subscribe(...);

【讨论】:

    猜你喜欢
    • 2017-09-03
    • 2018-08-31
    • 1970-01-01
    • 2019-10-08
    • 2018-10-17
    • 1970-01-01
    • 2017-07-27
    • 2017-05-15
    • 1970-01-01
    相关资源
    最近更新 更多