如何组合 mergeMap observables 调用并为整个 observable 只返回一个值

Mar*_*tin 6 javascript rxjs typescript angular

我在使用 rxjs 6.5 的 typescript/angular 中有这个场景:

   main(){

        const properties = ['session', 'user'];
        const source: Observable<any> = from(properties);

        source
            .pipe(
                mergeMap(key => this.getKey().map((value) => ({key: key, value: value}))),
                tap((result) => {
                    // sending the result elsewhere;
                }),
            ).subscribe(
            (result) => {
                console.log('Final result ->', result);
            }
        );

        console.log('\n');

    }

    getKey(): Observable<any> {
        // Mock function that returns an observable that emits 1 value
        const observable = from(['test']);

        return observable;
    }
Run Code Online (Sandbox Code Playgroud)

输出是:

Final result -> {key: "session", value: "test"}
Final result -> {key: "user", value: "test"}
Run Code Online (Sandbox Code Playgroud)

第一个问题: 如何以最优雅的方式在订阅源时返回1 个值,以及内部 observables 的组合结果?

我想要的输出,以这种方式订阅(因为我希望这个组合操作在管道中),将是:

(...).subscribe(
(result) => {console.log('Final Result:', result}
)

OUTPUT:

Final result -> [{key: "session", value: "test"}, {key: "user", value: "test"}]
Run Code Online (Sandbox Code Playgroud)

第二个问题 如果我不关心内部 observables 的结果,我如何只返回 1 个值或者我如何知道所有内部 observables 何时完成?

提前致谢。

Adr*_*rma 10

要获得 mergeMap 所有响应的合并结果,您还可以尝试这样:

return this.request1().pipe(
  mergeMap(res1=> this.request2(res1.id).pipe(
    map(res2=> {
      return {
        res1: res1,
        res2: res2
      }
    })
  ))
)
Run Code Online (Sandbox Code Playgroud)


kos*_*kos 4

Q1:您需要一个toArray\xe2\x80\x94 它将把所有流值合并到一个数组中:

\n\n

toArray 示例

\n\n

Q2:省略流中的所有值并在完成时发出一个值

\n\n
concat(\n  source$.pipe(ignoreElements()),\n  of(true)\n)\n
Run Code Online (Sandbox Code Playgroud)\n\n

源完成后发出一个值

\n\n

请参阅游乐场中的源完成时发出值”示例

\n