我有两项服务
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
}
第二个服务返回一个无法读取未定义属性映射的错误
答案 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
调用的结果将导致它返回Promise
到Observable
而不是Observable
。由于消费代码正在调用map
,我假设其目的是返回Observable
。这可以通过使用Observable.fromPromise
来实现。另一种方法是直接从存储服务返回Observable
但不知道该服务的内部结构,上述选项更简单。