我对Rx.observable.take()的误解是什么?

时间:2018-01-31 00:27:56

标签: angular rxjs

我还在通过一些实验学习如何将Angular5与rxjs一起使用,我遇到了一些我难以理解的事情。

如何使用Rx.Observable.take(count)

仅从Observable返回部分结果

我找到了一个返回500个数组项的API 在:https://jsonplaceholder.typicode.com/comments

我设置了一个名为rxservice的角度服务,它使用HttpClient.get()返回一个这样的observable:

    import { Injectable } from '@angular/core';
    import { Observable } from 'rxjs/Observable';
    import { of } from 'rxjs/observable/of';
    import { map,take } from 'rxjs/operators';
    import { Http } from "@angular/http";
    import { HttpClient, HttpHeaders } from '@angular/common/http';

    @Injectable()
    export class RxService {

    constructor(
      private http: HttpClient) { }  

      getComments():Observable<any>{
        this.http.get("https://jsonplaceholder.typicode.com/comments").take(42).subscribe(whyNotArrayof42 => console.log(whyNotArrayof42)); 
        return this.http.get("https://jsonplaceholder.typicode.com/comments").take(42); // <=== Returns an observable, but when I subscribe in the component, gives me all 500 array items.          
      }
    }

在组件中,我按如下方式调用服务:

getFromService() {
    this.rxservice.getComments()
    .subscribe(notAtTheComponentEither => console.log(notAtTheComponentEither));
  }

控制台吐出两个阵列,每个阵列有500个对象。我期望.take(42)只过滤出阵列的42个第一项。但事实并非如此。我有什么误会?有人能指出我正确的方向吗?

我知道我可以在收回数据时拼接数组,但我认为.take(count)背后的想法是限制从API加载的数量。如果数组大小为数百万,那么将它分成较小的块似乎是有意义的.take(count)不是吗?

1 个答案:

答案 0 :(得分:0)

您通常会将take()与分页运算符和数组混淆。 take(n)运算符将在n发出可观察数据后完成。

知道如何限制从API返回的数据量并不是一些神奇的功能。您需要明确告诉您的API您想要多少数据。

在您的示例中,整个数组是可观察数据,而不是数组的每个元素。每次在第42次发出后它将停止这样做时,整个数组都会发出,即你的订阅函数不会被调用。

您可以实现客户端(具有相对较小的数据集)或服务器端(具有较大的数据集)的分页,但是可观察量不是此的数据结构。