【问题标题】:RXJS modify order of subscribersRXJS 修改订阅者的顺序
【发布时间】:2021-02-14 08:02:20
【问题描述】:

是否可以确保订阅者是观察者队列中最后一个被执行的? delay(0) 对我来说是没有选择的,因为我需要代码在行中而不是异步执行。

let observable = new Subject<void>();

//delay(0) no option!
observable.pipe().subscribe(() => console.log("I want to be last!"));
observable.subscribe(() => console.log("I want to be first!"));

observable.next();

我在这里创建了一个示例:https://stackblitz.com/edit/rxjs-demo-xuf2ru

我希望第一个订阅者最后执行。当前控制台输出为:

我想成为最后一个!

我想成为第一!

【问题讨论】:

  • 你为什么在乎?如果您对此有疑问,则表明存在更深层次的问题。订阅者应该是独立的。
  • 我需要在所有事件发布后调用 Angular 的 cdr。我可以在调用主题之后调用它,或者在调用主题之后调用它,我认为更好。但由于它不是 cdr 特定的,我没有提到它,因为它不会造成不必要的混淆。

标签: javascript rxjs rxjs-observables


【解决方案1】:

你也可以使用一个通用的Subject作为observables之间的交流方式,如下图所示:

const observable = new Subject<void>();
const commonSub$ = new Subject();

observable.pipe().subscribe(() => {
  commonSub$
    .subscribe(() => {
      console.log('I want to be last!');
    });
});

observable.subscribe(() => {
  console.log('I want to be first!');
  commonSub$.next(true);
});

observable.next();

因此,只有在记录第二条消息后,才会记录第一条消息。


根据您的最新评论,您可以使用 switchMap 来确保为多个事件实现相同的功能:

observable
   .switchMap(() => {
      return commonSub$;
   })
   .subscribe(() => {
      console.log("I want to be last!");
   });

observable.subscribe(() => {
   console.log("I want to be first!");
   commonSub$.next(true);
});

【讨论】:

【解决方案2】:

您可以创建 2 个具有所需输出的 ​​observable,然后使用 mergeMap 运算符来保留顺序。

const observable1 = Observable.of("I want to be first!");
const observable2 = Observable.of("I want to be last!");

observable1
  .mergeMap(x => {
    console.log(x);
    return observable2;
  })
  .subscribe(x => console.log(x));

Stackblitz example

【讨论】:

  • 我喜欢你的想法,但不能让它发挥作用。我对其进行了一些修改以说明我的问题:stackblitz.com/edit/rxjs-demo-q6cuxq 我需要多次调用“observable1”(它用作外部事件)。现在,在调用了所有订阅者之后,我需要运行我的内部代码。
猜你喜欢
  • 2016-12-23
  • 1970-01-01
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多