网站搜索

typescript - 在 Angular 中以这种方式创建 HTTP 服务是否正确?


这是 HTTP 服务,会发起一个 get 请求以获取 longArray.js;

import { Injectable } from '@angular/core';
import { Http } from '@angular/http';

import 'rxjs/Rx';

@Injectable()
export class HttpService {

  constructor(
    private http: Http
  ) {}

  getHttpReq(url: string): Promise<any> {
    return new Promise((resolve, reject) => {

    this.http.get('http://192.168.0.189/longArray.js')
      .map(response => response.json())
      .subscribe(
        function(response) {
          console.log("Success Response ");
          resolve(response);
        },
        function(error) {
          console.log("Error happened " + error);
          reject(error);
        },
        function() {
          console.log("Subscription is completed ");
        }
      );

    });
  }
}

这是一个方法,会根据 longArray.js 是否被 HttpService 类中的 getHttpReq 获取来返回一个布尔值的 Promise;

getLongArrayTryOrFail(): Promise<boolean> {
    return new Promise((resolve,reject) => {

      this.httpService.getHttpReq('')
        .then(response => resolve(true))
        .catch(error => reject(false))

    });
  }
  • 这种创建 HTTP 服务的方法正确吗?
  • 基本上,getHttpReq(在类 HttpService 中)订阅一个 Observable,并根据订阅的成功响应或错误来解决或拒绝 promise。我说得对吗?

答案#1

  1. 这种创建 HTTP 服务的方法正确吗?

不,通常你不应该考虑将 Promise 与 Observable 一起使用。

  1. 基本上,getHttpReq(在 HttpService 类中)订阅一个 Observable,并根据订阅的成功响应或错误来解决或拒绝 Promise。我说得对吗?

你的 Promise 实现没有任何问题,但我不明白你为什么要回避使用 Observable。它拥有你所寻找的一切,并且它们是惰性的。下面是同样功能的 Observable 实现,仅用几行代码。

代码

export class HttpService {

  constructor(
    private http: Http
  ) {}

  getHttpReq(url: string): Observable<any> {
    return this.http.get('http://192.168.0.189/longArray.js')
      .map(response => response.json());
    });
  }
}
//consumption
getLongArrayTryOrFail(): Observable<boolean> {
    return this.httpService.getHttpReq('')
        .map(response => true)
        .catch(error => Observable.throw(false));
    });
}