[英]Subscribing multiple times to an observable rxjs
我正在努力實現以下目標:
我有一個可以訂閱多次的 Observable,雖然我只想做一次處理。
export class DataLoader
{
private loaded = false;
private data: Data;
private observable = null;
load(): Observable<Data> {
if(this.loaded) {
console.log('Already loaded');
return Observable.create((obs) => {
obs.next(this.data);
obs.complete();
})
}
if(this.observable === null) {
console.log('Creating observable');
this.observable = Observable.create((obs) => {
console.log('firing xhr');
let xhr;
xhr.onload = () => {
this.data = data;
this.loaded = true;
obs.next(data);
obs.complete();
this.observable = null;
}
xhr.onerror = () => {
obs.error(error);
this.observable = null;
}
});
}
return this.observable;
}
}
假設我在 2 個不同的地方使用這個 DataLoader,'xhr' 只會執行一次。
...
Dataloader.load().subscribe();
...
#At another point in the code
Dataloader.load().subscribe();
...
控制台:
Creating observable
firing xhr
Already Loaded
只要請求不會在彼此之后太快地被觸發,這就能正常工作。
為了演示,讓我們把它放在一個 for 循環中:
for(let i = 0; i<10; i++) {
DataLoader.load().subscribe();
}
在這種情況下,控制台如下所示:
Creating observable
firing xhr
firing xhr
firing xhr
firing xhr
firing xhr
firing xhr
firing xhr
firing xhr
firing xhr
firing xhr
我怎么能在 for 循環中使用它? 我一直在研究一個主題/行為主題,但我似乎無法讓它發揮作用。
餅干的想法
我使用以下方法解決了它:
if(this.observable === null) {
console.log('Creating observable');
let source = Observable.create((obs) => {
console.log('firing xhr');
let xhr;
xhr.onload = () => {
this.data = data;
this.loaded = true;
obs.next(data);
obs.complete();
this.observable = null;
}
xhr.onerror = () => {
obs.error(error);
this.observable = null;
}
});
let subject = new Subject();
this.observable = source.multicast(subject);
this.observable.connect();
}
http://reactivex.io/rxjs/manual/overview.html#multicasted-observables
我選擇使用簡單的承諾,因為我需要的只是一個多播事件,但似乎 rxjs 已經用“主題”處理了它
return this.service.add(this.formModel.value, this.imageFile)
.toPromise() // this.subscribe((x) => value = x, (err) => reject(err), () => resolve(value));
.then(id => this.formVm.editMode(id));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.