如何使用Skip和Take与RxJs Observable

时间:2016-06-03 15:33:07

标签: javascript typescript angular rxjs

我正在学习Angular 2,TypeScript,RxJ等等。我在使用RxJs和Observable在服务中返回数据子集时遇到了问题。

我希望下面的getCars函数读取一个json文件,解析它并返回一个数据片段(偏移和计数)。但是,我总是得到所有数据(我在测试的文件中有200个实体/汽车)。

我做错了什么?

EntityService

@Injectable()
export class EntityService {

  constructor(private http: Http) { }

  getCars(offset: number, count: number): Observable<Car[]> {
     return this.http
      .get('resources/data/cars.json')   
      .map(this.extractData)
      .skip(offset)
      .take(count)
      .catch(this.handleError);
  }

  private extractData(res: Response) {
    let body = res.json();
    return body.data || {};
  }

  private handleError(error: any) {
    // ...
  }
}

cars.json

    {
        "data":[
            {
                "vin":"ee8a89d8",
                "brand":"Fiat",
                "year":1987,
                "color":"Maroon"
            },
            {
                "vin":"642b3edc",
                "brand":"Renault",
                "year":1968,
                "color":"White"
            }
    ]
}

1 个答案:

答案 0 :(得分:7)

实际上,您将始终使用此加载所有数据。仅当您在数据流中收到多个事件时,skiptake运算符才适用:

  • 跳过:跳过一些事件
  • 采取:仅考虑指定数量的事件

在您的情况下(HTTP请求),您只有一个:获取数据时。因此,如果要过滤数据,则需要使用其他map运算符。这样的事情:

getCars(offset: number, count: number): Observable<Car[]> {
  return this.http
    .get('resources/data/cars.json')   
    .map(this.extractData)
    .map(data => {
      return data.slice(offset, offset + count); // <----
    })
    .catch(this.handleError);
}