我还在通过一些实验学习如何将Angular5与rxjs一起使用,我遇到了一些我难以理解的事情。
仅从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)
不是吗?
答案 0 :(得分:0)
您通常会将take()
与分页运算符和数组混淆。 take(n)
运算符将在n
发出可观察数据后完成。
知道如何限制从API返回的数据量并不是一些神奇的功能。您需要明确告诉您的API您想要多少数据。
在您的示例中,整个数组是可观察数据,而不是数组的每个元素。每次在第42次发出后它将停止这样做时,整个数组都会发出,即你的订阅函数不会被调用。
您可以实现客户端(具有相对较小的数据集)或服务器端(具有较大的数据集)的分页,但是可观察量不是此的数据结构。