如何订阅内部可观察和返回可观察

时间:2018-06-20 08:39:14

标签: angular observable

我想获取可观察的结果并进行一些更改,然后再次返回具有可观察类型的结果以供组件订阅。这是我的代码:

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,为什么我会收到此错误? 预先感谢

3 个答案:

答案 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,而不是需要取消订阅。