RXJS修改订户顺序

问题描述

是否可以确保订户是观察者队列中最后一个要执行的用户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

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

我想成为最后一个

我想成为第一!

解决方法

您还可以使用常见的 Subject 作为可观察对象之间的通信方式,如下所示:

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个可观察对象,然后使用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