Angular2使用不同的http.get

时间:2017-03-02 22:10:08

标签: http angular rxjs

我想了解更多有关Http.Get的信息。我正在使用json文件来模拟HTTP调用。在调用之后,我想将行限制为唯一状态。我知道有一个名为distinct(help on Rxjs distinct)的Rxjs命令。但是我不明白distinct的语法。当我按原样运行此代码时,我得到一组状态。然而,当我添加区别时,它仍然具有像德克萨斯州这样的重复状态。

    public getStates(): Observable<IState[]> {
    return this._http.get(this.stateUrl)
      .map((res: Response) => <IState[]>res.json())
      // distinct by state name
       .distinct((x) => return x.state)
     ;
  }    

以下是IState

的界面
export interface IState {
  id: number;
  state: string;
  city: string;
  name: string;
}

尝试仅获取具有唯一状态的行。

我在this Github project

上有代码

3 个答案:

答案 0 :(得分:0)

IState是一个对象。你必须确定彼此之间的确切原因 distinct 。你可以看一下documentation,有一种方法来定义使对象不同的原因 < / p>

例如:

/* Without key selector */
var source = Rx.Observable.of(42, 24, 42, 24)
  .distinct();

var subscription = source.subscribe(
  function (x) {
    console.log('Next: %s', x);
  },
  function (err) {
    console.log('Error: %s', err);
  },
  function () {
    console.log('Completed');
  });

// => Next: 42
// => Next: 24
// => Completed

/* With key selector */
var source = Rx.Observable.of({value: 42}, {value: 24}, {value: 42}, {value: 24})
    .distinct(function (x) { return x.value; });

var subscription = source.subscribe(
  function (x) {
    console.log('Next: %s', x);
  },
  function (err) {
    console.log('Error: %s', err);
  },
  function () {
    console.log('Completed');
  });

// => Next: { value: 42 }
// => Next: { value: 24 }
// => Completed

答案 1 :(得分:0)

在这种情况下,你有点混淆了鲜明的含义! 此distinct用于过滤来自Observable的响应,而不是其内容!在这里,你要尝试'#34; distinct&#34; (过滤)您的json对象,但distinct将过滤响应(多个)&#34;已解决&#34;由Observable。所以,如果可观察的&#34;解决了#34;多次同样的回复,由于您的.distinct,您只会收到一次。 这意味着,如果第一次Observable返回一个json(例如[{0:a,1:b,2:c}]),第二次返回相同的json响应,那么你的&#34;订阅者& #34;将不会收到两次,因为.distinct会&#34;过滤&#34;它因此不会被解雇!

更多详细信息:https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/distinct.md

所以,您正在寻找的是如何过滤&#34;你的json中重复的结果。 答案很简单:使用循环检查其属性/值或某些库(如下划线)可能已经实现了此方法。

答案 2 :(得分:0)

问题在于,当您致电.distinct((x) => return x.state)时,x变量是来自https://github.com/ATXGearHead12/distinct/blob/master/src/api/state.json的整个数组。然后,属性x.state不存在。

因此,您需要在数组中的每个项目上调用distinct,而不是在数组本身上。

例如,如下所示:

this._http.get(this.stateUrl)
    .map((res: Response) => <IState[]>res.json())
    .concatMap(arr => 
        Observable.from(arr).distinct((x) => return x.state)
    )
    .toArray(); // collect all items into an array