【问题标题】:How I use "Interval" or similar on an Http Observable?我如何在 Http Observable 上使用“Interval”或类似的?
【发布时间】:2016-09-30 03:33:44
【问题描述】:

我对 AngularJS (2.0.0-beta.16) 还很陌生。我已经设法通过 GET 请求设置了一个从 API 中提取数据的服务。现在,如何将其设置为每 n 秒运行一次 GET 请求?我看过其他帖子说你可以只使用this._http.get(...).interval(5000).map(...);,但是当我尝试这样做时,我得到了一个 Typescript 编译错误:

“可观察”类型上不存在属性“间隔”。

我犯了一个愚蠢的错误还是有更好的模式来做这件事?

import { Injectable } from 'angular2/core';
import { Http, Response } from "angular2/http";
import { Observable } from "rxjs/Observable";
import * as _ from "js/lodash.js"; 

import { Foo } from "./foo";

@Injectable()
export class FooService {
  fooList: Observable<Foo[]>;

  constructor(private _http: Http) {
      this.fooList = this._http.get('http://localhost:9090/api/').map(               
          response => {
              var json = response.json();
              if(response.ok === true) {
                  let newFooList: Foo[] = [];
                  _.forEach(json, f => {
                      newFooList.push(new Foo(f));
                  });
                  return newFooList;
              }
          throw Error("Bad status: " + response);
      });
   }
}

【问题讨论】:

  • 在可观察响应上使用 .delay(3000)
  • RxJs 并没有提供它在 Angular 2 中开箱即用的所有功能。您可能需要单独导入对 interval 的支持。查看此页面here 了解更多详情。
  • 您是否已经尝试导入 import { Observable } from "rxjs/Rx"; 而不是仅从 rxjs/Observable 导入?

标签: angularjs http typescript angular rxjs


【解决方案1】:

这可能不是唯一(或最好)的方法,但它对我有用。唯一的问题是第一个 GET 请求延迟了 create() 指定的时间量。

import { Injectable }         from "angular2/core";
import { Http, Response }     from "angular2/http";
import { Observable }         from "rxjs/Observable";
import { IntervalObservable } from "rxjs/observable/IntervalObservable";
import * as _                 from "js/lodash.js";

import { API_URI }            from "./constants";
import { Foo }                from "./foo";

@Injectable()
export class FooService {

    public fooList: Observable<Foo[]>;

    constructor(private _http: Http) {
        this.fooList = IntervalObservable.create(2000).flatMap(
            () => {
                return this._http.get(API_URI);
            }).map(
            response => {
                var json = response.json();
                if(response.ok === true) {
                    let newFooList: Foo[] = [];
                    _.forEach(json, f => {
                        newFooList.push(new Foo(f));
                    });
                    return newFooList;
                }
                throw Error("Bad status: " + response);
            });
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 2017-09-04
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多