Typescript Angular2 Http双订阅

Typescript Angular2 Http双订阅,typescript,angular,angular2-http,Typescript,Angular,Angular2 Http,可以调用Subscribe方法两次吗 我正在尝试构建api工厂,它将数据保存在工厂中,但每个ajax调用中的不同组件都可以使用这些数据 工厂 export class api { result = []; constructor (protected http: Http) { } getData () { return this.http.get('./friends.json').map((res: Response) => res

可以调用
Subscribe
方法两次吗

我正在尝试构建api工厂,它将数据保存在工厂中,但每个ajax调用中的不同组件都可以使用这些数据

工厂

export class api {

    result = [];

    constructor (protected http: Http) { }

    getData ()
    {
        return this.http.get('./friends.json').map((res: Response) => res.json()).subscribe(res => this.result = res);
    }
}
测试组件,它再次调用
subscribe
方法

export class TestPage {

    showListResult; 

    constructor (protected api: api) {

        this.api.getData().subscribe(res => this.showListResult = res)
    }

}

您可以返回新的可观察包装器。像这样的方法应该会奏效:

import {Observable} from 'rxjs/Observable'

export class api {

    result = [];

    constructor (protected http: Http) { }

    getData () {
        return new Observable(observer => {
            this.http.get('./friends.json')
                .map((res: Response) => res.json())
                .subscribe(res => {
                    this.result = res;
                    observer.next(res);
                    observer.complete();
                });
        });
    }
}

如果您希望发出一次HTTP请求,并将结果共享给多个订阅者,那么我建议使用可连接的观察者来发布和重播最后发出的值:

this.observable = http.get('...').map(t=> t.json()).publishReplay().refCount();
每个新订户将重播上次发出的值,而不发出新的HTTP请求


此答案与此类似。

删除共享部分,然后检查我的答案。使用
新可观察对象
观察者的点。下一步(res)。我发布的示例是它应该是什么样子。确保导入Observable.what'observator.next(res);'和
observer.complete()
do?@dfsq这样做的好处是什么,而不仅仅是共享原始的可观测数据?@MarkM在您给出共享答案后,我发布了这个版本(为什么要删除它?它很有用)。感谢您的评论-我删除了答案,因为它显然是错误的。现在我要去挖掘一些我认为工作正常的代码…