【问题标题】:RxJS best way to limit and return response results arrayRxJS 限制和返回响应结果数组的最佳方式
【发布时间】:2017-04-09 04:39:07
【问题描述】:

我正在使用 Angular 2 的 http 服务获取一些数据,API 返回 'n' 个结果,但我只想处理 'x' 个数量。

考虑到我无权访问 API 的端点(为了创建 limit 或 findOne 类方法),我正在尝试找出处理将返回到组件的结果数量的最佳方法调用我的 HomeService 的“loadLatest”方法。

在这个特定的例子中,响应是一个看起来像这样的对象:

{
 success: true,
 data: [Object, Object, Object],
 user: 'testUser'
}

我只对数据数组感兴趣(比如说,只获取它包含的前两个对象)。

如果我想得到一个结果,我可以这样做:

import { Http, Headers } from '@angular/http';
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map';

const URL = 'http://exampleapi.com/example';

@Injectable()
export class HomeService {
 constructor(private _http: Http){}

 loadLatest() {
  return this._http.get(URL)
  .map(res => res.json())
  .map(({data}) => data[0]);
 }
}

而且它有效(这并不一定意味着它实际上没问题)......但是,我知道必须有更好的方法来返回,例如,返回响应对象中数据数组中的前两个对象。或者前三个,或者前四个......或者我想要多少。

我阅读了有关“采取”方法的信息,但我不相信它在这种情况下实际上会起作用...

这是我订阅它并在我的组件中使用该服务的地方:

import { Component, OnInit } from '@angular/core';
import { HomeService } from './home.service';
import { Observable } from 'rxjs/Observable';

@Component({
 selector: 'home',
 templateUrl: './home.html'
})
export class HomeComponent implements OnInit {
 // I used this typing because I originally only wanted a single item
 // This might have to change
 items: Observable<Object>

 constructor(private homeService: HomeService){}

 ngOnInit() {
  this.homeService.loadLatest()
  .subscribe(result => this.items = result);
 }
}

如您所见,我希望结果是一个包含两个对象的数组,我将它们分配给 this.items,以便我可以使用 Angular 的 *ngFor 迭代这两个对象。

任何帮助将不胜感激! 提前致谢!

【问题讨论】:

  • 也许反对我的问题的人想详细说明他/她为什么这样做......不确定我的问题是否以正确的方式出现。我真的想知道是否有特定的反应方法可以完成上述操作,正如我对 Puigcerber 的回答所评论的那样,我还想知道带有 slice 方法的 map 方法是否是最永久的方法。但是对合法问题没有任何解释的否决票......真的吗?

标签: arrays http angular rxjs reactive-programming


【解决方案1】:

您可以在数据数组中使用slice 方法。

loadLatest() {
  return this._http.get(URL)
  .map(res => res.json())
  .map(({data}) => data.slice(0,2));
}

【讨论】:

  • 我仍然对 Array 的“map”方法和 RxJS 的 map 感到困惑。在数组的地图上,它总是进入您正在迭代的数组所包含的每个项目,您“不能”退出迭代。我想这就是我对此感到困惑的地方。我猜在这种情况下,我可以简单地在 map 方法中使用 slice,它只会“进入”一次并执行操作?我想说的是它不会进入 4 或 5 或 6... 次(“{data}”数组中的项目长度)并重复执行相同的切片操作,是吗?不知道我是否让自己清楚......
  • 我最初也考虑过您提出的这种方法,但是,我不确定这是否有效。因为我不太了解 Observables 和 RxJS 是如何工作的……不确定这是否真的是“轻量级”和高性能的,或者是否有特定的方法或模式来实现这一点。另外,真的不是说不是,我真的很想知道。
  • 每次有人订阅 observable 时,它​​们只会被调用一次。第一个map 获取response 对象并将其转换为第二个map 获取的JSON 对象,但您只需要数据属性,因此您使用对象解构来获取数据数组和slice它只返回您需要的部分。
  • 是的,绝对可以!非常感谢!是的,我想这不是你,但非常感谢你的支持和你的帮助!
  • @CharlesRobertson 您可以使用带有负索引的切片 data.slice(-2)
猜你喜欢
  • 2015-06-19
  • 1970-01-01
  • 1970-01-01
  • 2020-01-11
  • 1970-01-01
  • 1970-01-01
  • 2022-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多