Rxjs。嵌套的条件可观察的,可暂停“主要”的可观察的

时间:2019-10-04 19:59:35

标签: rxjs

我很讨厌:

const observable = new Observable(subscriber => {
  subscriber.next(1);
  subscriber.next(2);
  subscriber.next(3);
})

,我想以这种方式订阅:

observable.subscribe({
  next(x) { 
    console.log('got value ' + x); 
    if (x == 2) {
      const observable2 = new Observable(subscriber => {
       subscriber.next('a');
       subscriber.next('b');
       subscriber.next('c');
      })  
     observable2.subscribe(...)   
    }      
  },
  error(err) { console.error('something wrong occurred: ' + err); },
  complete() { console.log('done'); }
});

我有Observable哪个“抛出”了一些数据,如果数据等于某个特定值,我需要

  1. 暂停主要可观察对象

  2. 在if块中订阅Observable

  3. 从“有条件的”可观察数据中获取一些数据

  4. 恢复主要可观察对象

1 个答案:

答案 0 :(得分:0)

我认为,以这种方式处理可观察对象将使长期维护代码变得困难。如果您有多个可观察对象要订阅,则还必须处理它们的订阅等。

因此,对于这种特定情况,以下是我的解决方法:

const source = of(1, 2, 3);

const subscription = source
  .pipe(
    /**
     * `Pause` the main observable
     * Won't to get the next emitted value until this inner subscription is done
     */
    concatMap(v => {
      // The if block
      if (v === 2) {
        // Getting some data from the condition
        return of('a', 'b', 'c');
      }

      return of('default value');
    }),
  )
  .subscribe(v => console.log('value received!', v))

concatMaphigh order operators之一。

它还将返回一个可观察的对象,其订阅将由concatMap在内部 处理。

StackBlitz

阅读第一条评论后进行编辑

const microS1$ = ...;

microS1$
 .pipe(
  // Insert your condition here
  filter(content => typeof content === 'string')
 )
 .subscribe(d => {
  // Send the data to the second microservice
  microserviceTwo.sendData(d);
 })