这个问题在这里已有答案:
我正在将一个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;
}
});
}
...
我知道上面的内容不正确,但这就是我目前的情况。
你想从它那里找回一个观察者吗?
如果你是,那就是错误,因为当你返回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的文档中(最常用)。