我已经看过像rxjs这样的教程。
我的问题是:
1)这里take(1)
的用法是什么?我在网上看到了很多解释,但我并没有真正理解。此外,我认为在此代码中使用take(1)
没有任何好处。并且作者在REST api相关服务中的每个返回函数上都使用take(1)
。
2)作者在订阅后没有取消订阅。是因为作者使用take(1)
因此不需要手动取消订阅吗?
3)如果我想实现catch功能怎么办?我应该在服用之前还是之后实施它。
getProfile() { // this is a call to REST API
return this.service.getProfile()
.map(res => res.json())
.take(1)
}
}
this.data.getProfile().subscribe(profile => {
this.userProfile = profile;
});
答案 0 :(得分:6)
作者在订阅后没有取消订阅。是因为 作者使用take(1)因此不需要手动取消订阅?
是的,这很可能是作者使用take(1)
运算符的原因。它的工作是将一个值传递给一个observable,然后取消订阅源。但根据服务,可能不需要。
例如,在Angular中,HttpClient
服务在发送最终HttpResponse
事件值后自行完成流,因此您既不需要使用take
也不需要明确取消订阅。 Here is the sources:
@Injectable()
export class HttpXhrBackend implements HttpBackend {
...
handle(req: HttpRequest<any>): Observable<HttpEvent<any>> {
...
// Everything happens on Observable subscription.
return new Observable((observer: Observer<HttpEvent<any>>) => {
...
// First up is the load event, which represents a response being fully available.
const onLoad = () => {
...
if (ok) {
// A successful response is delivered on the event stream.
observer.next(new HttpResponse({
body,
headers,
status,
statusText,
url: url || undefined,
}));
// The full body has been received and delivered, no further events
// are possible. This request is complete.
observer.complete(); <---------------------------------
}
如果我想实现catch功能怎么办?我应该在服用之前还是之后实施它。
您可以在take
之后实施,因为take
也会传输错误。
const stream = Observable.create((observer) => {
observer.error(new Error());
}).take(1).catch(() => {
return Observable.of(`An error occurred`);
}).subscribe((v) => {
console.log(v); // An error occurred
})