2016-11-24 3 views
2

Я использую HTTP-сервис Angular 2 для получения некоторых данных, API возвращает «n» количество результатов, но я хочу только обрабатывать сумму «x».RxJS лучший способ ограничить и вернуть массив результатов ответа

Учитывая, что у меня нет доступа к конечным точкам API (для создания методов ограничения или findOne), я пытаюсь выяснить, как лучше всего обрабатывать количество результатов, которые будут возвращены в который вызывает мой метод «loadLatest» моего HomeService.

При этом конкретном примере, реакция является объектом, который выглядит примерно так:

{ 
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, так что я могу перебрать этих двух объектов с использованием углового-х * ngFor.

Любая помощь была бы принята с благодарностью! Спасибо заранее!

+0

Возможно, человек, который отклонил мой вопрос, хотел бы уточнить, почему он/она сделал это ... Не уверен, что мой вопрос натолкнулся на правильный путь. Мне действительно интересно, есть ли определенный реактивный метод, чтобы выполнить вышеописанное, и, как я прокомментировал ответ Puigcerber, мне также интересно, является ли метод карты с помощью метода среза наиболее подходящим подходом. Но нисходящий поток без объяснения законного вопроса ... Действительно? – deathandtaxes

ответ

4

Вы можете использовать метод slice в массиве данных.

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

Я все еще запутался между методом «карты» Маре и картой RxJS. На карте массива он всегда входит в каждый из элементов, которые содержит массив, который вы повторяете, вы «не можете» вырваться из итерации. Думаю, это меня смутило. Я предполагаю, что в этом случае я могу просто использовать срез внутри метода карты, и он только «войдет» один раз и выполнит операцию? Я пытаюсь сказать, что он не будет проходить через 4 или 5 или 6 ... раз (длина элементов внутри массива «{data») и повторять одно и то же действие среза, да? Не уверен, что я даю себе понять ... – deathandtaxes

+0

Я изначально думал об этом подходе, который вы предлагаете, однако, я не уверен, что это исполнитель или нет. Потому что я не совсем понимаю, как работают Observables и RxJS ... Не уверен, что это на самом деле «светло» и исполнено, или если для достижения этого существует определенный метод или шаблон. Кроме того, на самом деле я не говорю, что это не так, я искренне удивляюсь. – deathandtaxes

+0

Они будут называться только один раз, каждый раз, когда кто-то присоединяется к наблюдаемому.Первая «карта» получает объект «response» и преобразует его в объект JSON, который является тем, что получает вторая «карта», но вам нужно только свойство данных, поэтому вы используете деструктурирование объекта для получения массива данных и 'slice' он должен вернуть только часть, в которой вы нуждаетесь. – Puigcerber

Смежные вопросы