Javascript 一个可观察的多个订户Rxjs/角度共享不工作

Javascript 一个可观察的多个订户Rxjs/角度共享不工作,javascript,angular,rxjs,angular4-httpclient,Javascript,Angular,Rxjs,Angular4 Httpclient,我在一个项目中使用angular 4,我正在进行http调用以获取数据。当数据从后端返回时,我缓存数据,以便对于后续请求,我不必一次又一次地进行rest调用 getApplication(): Observable<Array<Application>> { return new Observable<Array<Application>>((observer) => { if (this.app&am

我在一个项目中使用angular 4,我正在进行http调用以获取数据。当数据从后端返回时,我缓存数据,以便对于后续请求,我不必一次又一次地进行rest调用

getApplication(): Observable<Array<Application>> {
        return new Observable<Array<Application>>((observer) => {
            if (this.app&& this.app.length > 0) {
                observer.next(this.app)
            } else {
                this._http
                    .get<Application[]>(this.url)
                    .map((app) => this.mapToApp(app))
                    .subscribe((result: Array<Application>) => {
                        observer.next(result);
                    }, () => {
                        observer.next([]);
                    })
            }
        })
    }
getApplication():可观察{
返回新的可观察对象((观察者)=>{
如果(this.app&&this.app.length>0){
observer.next(this.app)
}否则{
这个
.get(this.url)
.map((app)=>this.mapToApp(app))
.subscribe((结果:数组)=>{
下一步(结果);
}, () => {
观察员:下一个([]);
})
}
})
}
这个很好用。但是如果两个呼叫同时进行,我看到网络选项卡中有两个请求,而不是一个。所以我尝试share()来满足“一个可观察的多个订阅者”

getApplication(): Observable<Array<Application>> {
            return new Observable<Array<Application>>((observer) => {
                if (this.app&& this.app.length > 0) {
                    observer.next(this.app)
                } else {
                    this._http
                        .get<Application[]>(this.url)
                        .map((app) => this.mapToApp(app))
                        .subscribe((result: Array<Application>) => {
                            observer.next(result);
                        }, () => {
                            observer.next([]);
                        })
                }
            }).share()
        }
getApplication():可观察{
返回新的可观察对象((观察者)=>{
如果(this.app&&this.app.length>0){
observer.next(this.app)
}否则{
这个
.get(this.url)
.map((app)=>this.mapToApp(app))
.subscribe((结果:数组)=>{
下一步(结果);
}, () => {
观察员:下一个([]);
})
}
}).share()
}

但这也是,我看到网络选项卡中有多个请求,而不是一个。为了只拨打一个电话并与所有订户共享结果,必须做些什么?请帮忙

是否调用getApplication()方法两次?如果是,则创建两个不同的观测值


也许您应该使用subjects来遵循publisher/subscriber模式?

是否调用getApplication()方法两次?如果是,则创建两个不同的观测值


也许你应该遵循使用主题的Publisher/订阅模式?

< P>我的第一个建议是考虑代码沿着这些行的一个简单化< /P>
getApplication(): Observable<Array<Application>> {
      if (this.app && this.app.length > 0) {
         return Observable.of(this.app);
      }
      return this._http
                    .get<Application[]>(this.url)
                    .map((app) => this.mapToApp(app))
                    .do((result: Array<Application>) => {
                        this.app = result;
                    }
}
这里的技巧是由
shareReplay
操作符执行的。它的共享部分确保订阅是共享的。它的重播部分(缓冲区大小为1)确保始终返回存储的最后一个结果


然后,您可能会面临偶尔清除缓存一次的问题。但是这里的故事变得更复杂了,我建议你看看这篇非常好的文章

< p>我的第一个建议是考虑代码中的一些简化,沿着这些线

getApplication(): Observable<Array<Application>> {
      if (this.app && this.app.length > 0) {
         return Observable.of(this.app);
      }
      return this._http
                    .get<Application[]>(this.url)
                    .map((app) => this.mapToApp(app))
                    .do((result: Array<Application>) => {
                        this.app = result;
                    }
}
这里的技巧是由
shareReplay
操作符执行的。它的共享部分确保订阅是共享的。它的重播部分(缓冲区大小为1)确保始终返回存储的最后一个结果


然后,您可能会面临偶尔清除缓存一次的问题。但是这里的故事变得更复杂了,我建议你看看这篇非常好的文章

嗨,我会使用一个
行为主题
,当调用
下一个
时发布它的变化:共享听起来很简单,不是吗!它在内部使用
Subject
,仅当观察者当时已经订阅了值时,才将其多播给观察者。因此,如果某个对象订阅了一个值,然后另一个对象订阅了该值,则不会得到相同的值。本质上,
share
允许第一个偷东西<代码>共享重播(1)修复了此问题。我发现
share
最有用的是当你有一个可连接的observable时,这个observable直到你确定所有订阅者都订阅了才开始,然后你就可以
share
在这种情况下分享你想要的一切。嗨,我会使用一个
Behavior Subject
在调用
next
时发布它的变化:share听起来很简单不是吗!它在内部使用
Subject
,仅当观察者当时已经订阅了值时,才将其多播给观察者。因此,如果某个对象订阅了一个值,然后另一个对象订阅了该值,则不会得到相同的值。本质上,
share
允许第一个偷东西<代码>共享重播(1)修复了此问题。我发现
share
最有用的是当你有一个可连接的observable时,这个observable直到你确定所有订阅者都订阅了才开始,然后你就可以
share
在这种情况下,你想要的一切。是的,我在两个不同的地方调用了两次。。你能举个例子说明我如何在我的案例中使用这种模式吗?是的,我在两个不同的地方用过两次。。你能举个例子说明我如何在我的案例中使用这个模式吗