【问题标题】:Is this method of creating a HTTP Service in Angular correct?这种在 Angular 中创建 HTTP 服务的方法是否正确?
【发布时间】:2017-06-20 03:55:28
【问题描述】:

这是 HTTP 服务,发出一个获取 longArray.jsget 请求;

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 ");
        }
      );

    });
  }
}

这是一个返回 bool 承诺的方法,具体取决于 longArray.js 是否由 getHttpReq(在 HttpService 类中)获取;

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

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

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

【问题讨论】:

  • 为什么需要承诺?不能使用 Observable
  • 如果你真的想返回一个promise,那么只需在http.get返回的observable上使用toPromise()

标签: angular typescript rxjs observable es6-promise


【解决方案1】:
  1. 这种创建 HTTP 服务的方法正确吗?

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

  1. 基本上 getHttpReq(在类 HttpService 中)订阅一个 可观察的 & 解决或拒绝承诺取决于 订阅的成功响应或错误。我说的对吗?

你的 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));
    });
}

【讨论】:

  • switchMap 这里的目的是什么?
  • @torazaburo map 应该可以解决问题。感谢您的提醒。 :) 如果我有 switchMap 那么我需要从那里显式返回 Observable .. 正确吗??
猜你喜欢
  • 1970-01-01
  • 2014-01-10
  • 1970-01-01
  • 1970-01-01
  • 2016-05-23
  • 2018-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多