javascript - 尝试从 "observable' s 链获取可观察性时出现错误”

标签 javascript angular functional-programming rxjs observable

嗯。我的 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 */              
    }
 }

我跳过了一些类型和命名变量有点尴尬(但简单)因为这不是重点。代码有效。但是我想封装用户构建(来自 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);
        });
      }
    });
  });
}

我的 WebStorm 没有显示任何错误。但在控制台中,我得到 this.userService1.getUsers(...).merge is not a function

我已经尝试过mergeconcatflatMap 等等——但仍然没有成功。唯一的区别是我遇到的错误。我对 rxjs 没有太多经验,所以我被卡住了。任何帮助或提示将不胜感激。

更新。
已解决,但 7 天(赏金事件期间)仍然欢迎任何人提供更简洁和实用的解决方案:)

最佳答案

我想这就是你想要的:

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)

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)

关于javascript - 尝试从 "observable' s 链获取可观察性时出现错误”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50768217/

相关文章:

javascript - 在没有公共(public) API 的情况下连接到网站 webosocket

function - PL/SQL 将函数作为参数传递

javascript - 输入值改变时改变背景图片

javascript - Jquery,Jcarousel,第一个分页项设置为 :active unless another is set

javascript - Jquery:将同一行上的复选框的值求和到同一行上的文本字段

php - 单击按钮时使用ajax获取文本框文本

Angular2 - 在不同环境中执行端到端测试

angular - 在Angular 7中使用变量作为参数进行ngx-translate

recursion - Scheme中的递归函数组合

Scala "match"帮助