rxjs 管道和订阅(在一个主题上)在两个单独的步骤中没有按预期工作

sl3*_*dg3 3 rxjs typescript rxjs6

这让我很头疼……以下代码确实按预期工作:

const s$ = new Subject<any>();
  s$.pipe(
      switchMap(
        x => {
          debugger;
          return myService.getSth();
        }
      )
    ).subscribe(x => {
    debugger;
  });
  s$.next();
Run Code Online (Sandbox Code Playgroud)

无论debuggerswitchMapsubscribe部分被击中。
但是,如果我将其拆分(我想将整个管道内容移动到单独的库中),switchMap则不再调用 中的调试器,这意味着不会调用此特定示例中的服务:

  const s$ = new Subject<any>();
  s$.pipe(
      switchMap(
        x => {
          debugger;
          return myService.getSth();
        }
      )
    );

  // ...

  s$.subscribe(x => {
    debugger;
  });
  s$.next();
Run Code Online (Sandbox Code Playgroud)

我在这里想念什么?

Nic*_*wer 7

调用.pipe一个 observable(包括一个主题)不会修改那个 observable 的作用,而是产生一个新的observable。在您的第一个示例中,您在该新 observable 上调用 subscribe。在您的第二个示例中,您不对新的 observable 做任何事情,然后订阅原始的非映射主题。没有任何内容引用新的 observable,它就丢失了。

将结果保存.pipe到一个变量,然后订阅它:

const mapped$ = s$.pipe(
  switchMap(
    x => {
      debugger;
      return myService.getSth();
    }
  )
);

mapped$.subscribe(x => {
  debugger;
});

s$.next();
Run Code Online (Sandbox Code Playgroud)