0

我将 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;
      }
    });
  }
...

我知道上面是不正确的,但这是我目前所拥有的。

4

1 回答 1

4

你想从中返回一个可观察的吗?

如果是,则会出现错误,因为当您返回 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 的值,它是一个值(对象、文本等)。问题是,由于它是异步的,因此该方法实际上返回未定义的同步调用,因此您必须注意这一点。

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

于 2019-04-18T16:38:44.963 回答