自定义http请求返回angular2

时间:2017-02-12 01:20:47

标签: angular typescript

我有两项服务

Http client service

 get(url):any{
  this.storage.get('token').then((name) => {
    let headers = new Headers();
    this.createGeneralHeaders(headers);
    return this.http.get(url+"?access-token="+name, {
      headers: headers
    });

});

然后我有了这个

  constructor( private _httpClient:HttpClient){}

  getTrucks():Observable<any>{
   return this._httpClient.get(this.trucksurl+"phone-trucks")  
       .map(res => res.json().data)  //returns an error

  }

第二个服务返回一个无法读取未定义属性映射的错误

1 个答案:

答案 0 :(得分:0)

您的get(url)方法不会返回任何内容。这就是您遇到此问题的原因。

另请注意, 应指定any类型。如果你让它推断出void的返回类型,编译器会抓住这个错误,而是你将返回类型指定为any,无条件地短路类型推断过程

我意识到很多角度示例都是这样做的,但这些示例并不是好的TypeScript代码的例子。

假设您的第一个服务中的http是对官方角度2 http服务的引用,您会想要类似

的内容
import {Observable} from 'rxjs/Observable';
import 'rxjs/add/observable/fromPromise';
import 'rxjs/add/operator/mergeMap';

export class HttpClient {
  get(url: string) {
    const headers = new Headers();
    this.createGeneralHeaders(headers);

    return Observable
      .fromPromise(this.storage.get('token'))
      .flatMap(
        name => this.http.get(`${url}?access-token=${name}`, {headers})
      );
  }
}

在原始代码中,get未返回任何内容,并且更新它以返回then调用的结果将导致它返回PromiseObservable而不是Observable。由于消费代码正在调用map,我假设其目的是返回Observable。这可以通过使用Observable.fromPromise来实现。另一种方法是直接从存储服务返回Observable但不知道该服务的内部结构,上述选项更简单。