我想获取可观察的结果并进行一些更改,然后再次返回具有可观察类型的结果以供组件订阅。这是我的代码:
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/throw';
import 'rxjs/add/observable/of';
import {Observable} from 'rxjs/Observable';
get_items() {
this.http.get(this.router_url).map(res => res.json()).catch(this.handleRequestError).subscribe(
(result) => {
result = result.data[0].my_item
return Observable.of( data: [{my_items: result}]});
},
(error) => {}
)
}
问题出在正在使用并尝试对get_items()的结果进行订阅的组件中,它们得到以下错误:未捕获(承诺):TypeError:
this.generalService.get_items(...)。subscribe不是函数
但是当我刚回来时:
return Observable.of( data: [{my_items: result}]});
它工作正常,但这不是我想要的 无论如何,结果类型是Observable,为什么我会收到此错误? 预先感谢
答案 0 :(得分:5)
您可以执行以下操作:
get_items() {
this.http.get(this.router_url).map(res => {
const result = res.json();
return {data: [{my_items: result.data[0].my_item}]};
});
}
map
运算符是您实际订阅响应之前应该对其进行修改的地方。
答案 1 :(得分:1)
正如角度文档所说,HttpClient
的{{1}}返回一个Observable。因此,您不必创建一个新的。
get()
尝试一下。并将/**
* Construct a GET request which interprets the body as JSON and returns it.
*
* @return an `Observable` of the body as type `T`.
*/
get<T>(url: string, options?: {
headers?: HttpHeaders | {
[header: string]: string | string[];
};
observe?: 'body';
params?: HttpParams | {
[param: string]: string | string[];
};
reportProgress?: boolean;
responseType?: 'json';
withCredentials?: boolean;
}): Observable<T>;
替换为表示响应的接口;
any
在组件中。
import { Observable } from "rxjs";
get_items() Observable<any>{
return this.http.get<any>(this.router_url).map(res => res.json());
}
答案 2 :(得分:1)
我遇到了类似的问题,这就是我解决它的方法。
FooService.ts
private fetchFoo(): Observable<any> {
return this.httpService.get('/foo');
}
public async getFoo(): Promise<Foo[]> {
if(this.foo.length === 0) {
return this.fetchFoo()
.toPromise() <-- use in place of .subscribe
.then((response) => {
this.foo = response.data;
return this.foo;
}, (err) => {
console.debug(err);
return this.foo;
});
} else {
return this.foo;
}
}
AnyComponent.ts
public getFoo(): void {
this.fooService.getFoo().then((response) => {
this.doSomething(response);
})
}
使用.toPromise
代替.subscribe
处理可观察对象仍将执行网络调用,并将公开的服务功能设置为可以接受的Promise,而不是需要取消订阅。