尝试从"可观察链"中观察到错误

imp*_*end 6 javascript functional-programming observable rxjs angular

好.我的Angular组件中有一些异步代码,效果很好.看起来像这样(简要):

export class SomeComponent {

    user: User;
    /* ... */
    email: string;
    /* ... */

    private someMethod(): void {
      /* some code here */
      this.userService1.getUsers().subscribe(users => {
        users.forEach(user => {
          if (user.email && user.email === this.email) {
             this.userService2.getUser(user.id).subscribe(foundUser => {
               let someFields;
               if (foundUser) {
                 someFields = (({ field1, field2 }) => ({ field1, field2 }))(foundUser); 
               }
               this.user = {...user, ...someFields};
             });
           }
         });
      });
      /*some code here */              
    }
 }
Run Code Online (Sandbox Code Playgroud)

我跳过一些类型和名称变量有点尴尬(但很简单)因为它不是重点.代码有效.但我想封装用户构建过程(来自2个服务)因为我需要它在不同的组件中.我试过了,但......

constructUser(email): Observable<IUser> {
  let finalUser: IUser;

  return this.userService1.getUsers().merge(users => {
    return users.filter(user => {
      if (user.email && user.email === email) {
        return this.userService2.getUser(user.id).map(foundUser => {
          let someFields;
          if (foundUser) {
            someFields = (({ field1, field2 }) => ({ field1, field2 }))(foundUser); 
          }
          finalUser =  {...user, ...someFields};

          return Observable.of(finalUser);
        });
      }
    });
  });
}
Run Code Online (Sandbox Code Playgroud)

我的WebStorm没有显示任何错误.但是在控制台中我得到了这个.userService1.getUsers(...).merge不是一个函数.

我尝试过merge,concat,flatMap,无论如何 - 但仍然没有成功.唯一的区别是我得到的错误.我对rxjs没有多少经验,所以我被卡住了.任何帮助或提示将不胜感激.

UPD.
解决了,但7天(虽然赏金活跃)任何人仍然欢迎更简洁和功能的解决方案:)

Rob*_*hof 5

我觉得这样的事情就是你想要的:

RxJs 5:

import 'switchMap' from 'rxjs/add/operator/switchMap';
import 'map' from 'rxjs/add/operator/map';


this.userService1.getUsers()
    .map(users => users.find(userInList => userInList.email === "SomeEmail")) //Map the observable with users to a single user
    .switchMap(user => this.userService2.getUser(user.id)) //Map the observable by an other observable
    .subscribe(...doSomething with the result)
Run Code Online (Sandbox Code Playgroud)

RxJs 6:

import {map, switchMap} from 'rxjs/operators';

this.userService1.getUsers().pipe(
    map(users => users.find(userInList => userInList.email === "SomeEmail")), //Map the observable with users to a single user
    switchMap(user => this.userService2.getUser(user.id)) //Map the observable by an other observable
).subscribe(...doSomething with the result)
Run Code Online (Sandbox Code Playgroud)