Angular 2,使用带有管道的observable并返回结果[重复]

问题描述 投票:-1回答:1

这个问题在这里已有答案:

我正在将一个id传递给一个进行api调用的管道,并返回一个observable。我需要返回管道请求过滤的数据:

...
  transform(value: string, userProp?: any): any {
    let userData;
    this.userService.getUser(value).subscribe(res => {
      userData = res;
      if (!userProp) {
        return userData;
      } else {
        const prop = userProp === 'displayName' ? `${userData.firstName} ${userData.lastName}` : oneProjectUser(value)[userProp];
        return prop;
      }
    });
  }
...

我知道上面的内容不正确,但这就是我目前的情况。

angular observable angular-pipe
1个回答
1
投票

你想从它那里找回一个观察者吗?

如果你是,那就是错误,因为当你返回userData时,你不会返回observable,而是返回值。如果你想返回observable,不要订阅它,而是使用.pipe(map( your res => transform logic...)),这样,你正在转换observable结果并在observable中返回映射结果。当你订阅时,你会消耗observable,因此就是错误。

例如:

...
  transform(value: string, userProp?: any): any {
    return this.userService.getUser(value).pipe(map(res => { // changed the subscribe
      let userData; // scoping it inside the return
      userData = res;
      if (!userProp) {
        return userData;
      } else {
        const prop = userProp === 'displayName' ? `${userData.firstName} ${userData.lastName}` : oneProjectUser(value)[userProp];
        return prop;
      }
    }));
  }
...

我认为这是对的,但还没有测试过。请告诉我它是否有效

编辑澄清

如果你这样做:return this.service.get()并且它返回一个可观察的,你得到一个Observable<T>;

return this.service.get().subscribe()你正在返回一个Subscription界面,这不是你想要的(它有取消订阅方法等等,但它不是Observable)。

this.service.get(res => { return res }),你返回res的值,这是一个值(对象,文本,等等)。问题是,由于它是异步的,teh方法实际上返回undefined与同步调用,所以你必须意识到这一点。

管道允许你在Observables中操作结果,这样你就可以从你想要获得的调用中获得。阅读它们,最常见的是map, tap, filter和一些我不记得的,它们在Angular的文档中(最常用)。

© www.soinside.com 2019 - 2024. All rights reserved.