[英]Observable subscription not getting called
我有一個Observable,用於將諾言轉換為訂閱。 這導致我需要迭代一個集合以在每個元素上調用HTTP服務。 我正在使用forkJoin等待所有這些調用完成,以便我可以做其他事情,但是不幸的是,我的訂閱沒有被調用。 你看到我在這里想念的嗎?
Observable.fromPromise(this.users.getElements()).subscribe(results => {
Observable.forkJoin(
results.map(
aUser => this.HttpService.submitUser(aUser).subscribe(
results => {
this.progress += 1;
},
err => {
this.progress += 1;
this.handleError(<any>err);
})
).subscribe(
//it never gets to either of these calls after all service calls complete
data => {
debugger;
console.log(data);
this.reset();
},
err => {
debugger;
console.log(err);
this.reset();
}
));
});
一件事是您不訂閱傳遞給forkJoin()
每個Observable。 操作員必須自己做。
如果要在每個Observable完成時收到通知,則可以使用.do(undefined, undefined, () => {...})
。
let observables = [
Observable.of(42).do(undefined, undefined, () => console.log('done')),
Observable.of('a').delay(100).do(undefined, undefined, () => console.log('done')),
Observable.of(true).do(undefined, undefined, () => console.log('done')),
];
Observable.forkJoin(observables)
.subscribe(results => console.log(results));
打印到控制台:
done
done
done
[ 42, 'a', true ]
最終還有.finally()
運算符。 但是,它與使用.do()
。
編輯:
當任何源Observable失敗時, forkJoin()
運算符將重新forkJoin()
錯誤(這意味着它也將失敗)。
這意味着您需要分別捕獲每個Observable源中的錯誤catch()
例如,使用catch()
運算符)。
let observables = [
Observable.throw(new Error())
.catch(() => Observable.of('caught error 1'))
.do(undefined, undefined, () => console.log('done 1')),
Observable.of('a')
.delay(100).catch(() => Observable.of('caught error 2'))
.do(undefined, undefined, () => console.log('done 2')),
Observable.of(true)
.catch(() => Observable.of('caught error 3'))
.do(undefined, undefined, () => console.log('done 3')),
];
Observable.forkJoin(observables)
.subscribe(results => console.log(results));
哪些打印:
done 1
done 3
done 2
[ 'caught error 1', 'a', true ]
我認為您不需要訂閱地圖。
Observable.fromPromise(this.users.getElements()).subscribe(results => {
Observable.forkJoin(
results.map(
aUser => this.HttpService.submitUser(aUser))
).subscribe(
//it never gets to either of these calls after all service calls complete
data => {
debugger;
console.log(data);
this.reset();
},
err => {
debugger;
console.log(err);
this.reset();
}
));
});
請注意,在此處的rxjs示例中:
https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/forkjoin.md
他們不訂閱各個可觀察對象-ForkJoin使它們全部進行,然后等待它們全部返回(在您的訂閱中)。
編輯:
forkjoin源在這里:
https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/forkjoin.js
而且看起來好像沒有鈎子可以確定何時完成。 我認為,處理UI欄的最佳方法是分別訂閱每個映射的可觀察對象,它們都調用一個函數來增加UI計數欄變量並進行一些“完整性”測試,以允許您使用數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.