在我的ngOnInit中,我想等待所有fetchLists的請求完成后再繼續進行:
ngOnInit()。void {
this.fetchLists()。
this.route.params。 subscribe(span class="hljs-params">params => {
this.doSomethingWithFetchedLists()。
}
});
}
fetchLists()。void {
this.httpHandlerCached.getListsA()
.subscribe(listA => this.listA = listA) 。
this.httpHandlerCached.getListsB()
.subscribe(listB => this.listB = listB) 。
this.httpHandlerCached.getListsC()
.subscribe(listC => this.listC = listC) 。
}
請聽我說,我之前的問題是以參考使用 "forkJoin "來結束的。等待多個承諾的完成
然而,使用forkjoin,我有完全相同的問題:
fetchListnames(/span>) {
return forkJoin([
this.httpHandlerCached.getListsA()。
this.httpHandlerCached.getListsB() 。
this.httpHandlerCached.getListsC() 。
]).subscribe(res => {
this.listA = res[0] 。
this.listB = res[1] 。
this.listC = res[2] 。
});
}
那么在使用forkJoin的建議下,我現在如何才能等待forkjoin完成后再繼續進行(指在呼叫this.doSomethingWithFetchedLists()前)?
uj5u.com熱心網友回復:
不建議像另一個答案所建議的那樣,把訂閱放在訂閱的內部。相反,我們應該依靠rxjs管道,只訂閱一次。
在這種情況下,人們可以認為將this.route.params放在forkJoin內會起到作用,但是由于this.route.params將永遠不會完成,forkJoin將不會發射(這就是forkJoin的實作方式)。為了使this.route.params完成,你可以把它輸送到take(1),結果是這樣的代碼:
forkJoin([
this.httpHandlerCached.getListsA()。
this.httpHandlerCached.getListsB() 。
this.httpHandlerCached.getListsC() 。
this.route.params。 pipe(take(1))
]).subscribe(span class="hljs-params">res => {
this.listA = res[0] 。
this.listB = res[1] 。
this.listC = res[2] 。
this.doSomethingWithFetchedLists()。
});
你也可以使用combineLatest來代替forkJoin,它不是等待所有的觀察變數完成,而是每當其中一個觀察變數發生變化時就會發射(但它會先等待所有觀察變數至少發射一個值)。
combineLatest([
this.httpHandlerCached.getListsA()。
this.httpHandlerCached.getListsB() 。
this.httpHandlerCached.getListsC() 。
this.route.params.
]).subscribe(span class="hljs-params">res => {
this.listA = res[0] 。
this.listB = res[1] 。
this.listC = res[2] 。
this.doSomethingWithFetchedLists()。
});
如果你使用后一種方法,你必須手動取消訂閱(或管道到take(1)/code>)。否則你將會出現記憶體泄漏。
uj5u.com熱心網友回復:
補充Christian的回答,你可以使用withLatestFrom來避免嵌套訂閱
fetchListnames(/span>) {
return forkJoin([
this.httpHandlerCached.getListsA()。
this.httpHandlerCached.getListsB() 。
this.httpHandlerCached.getListsC() 。
])
.pipe(
withLatestFrom(this.route.params.pipe(take1)) 。
map(([res, routeParams]/span>) => {
return { res, routeParams }.
})
)
.subscribe(response => {
let res = response.res;
let routeParams = response.routeParams;
this.listA = res[0] 。
this.listB = res[1] 。
this.listC = res[2] 。
this.doSomethingWithFetchedLists()。
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/332366.html
標籤:
