Rxjs:取(1)用法

时间:2017-09-22 04:24:57

标签: angular ionic-framework ionic2 rxjs

我已经看过像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;
});

1 个答案:

答案 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
})