我試圖避免嵌套一些相互依賴的同步呼叫。我還想在所有完成后在最終結果上進行訂閱,例如 forkjoin。
我已經找到了如何在 stackoverflow 上執行此操作(在繼續主訂閱 (rxJs) 之前等待 angular 中的嵌套訂閱),但沒有找到如何動態執行此操作。
目前我正在使用回呼,但是當所有完成 / forkjoin 行為時,這不適用于訂閱:
public keys = ['stateId', 'countyId'];
function populate(index, params = null) {
let route = this.baseRoute this.keys[index];
this.apiCall(route, params).subscribe(response => {
if (index 1 < keys.length) {
this.populate(index 1, this.getParamsFromResponse(response));
}
這是上面參考的stackoverflow鏈接的答案:
getData() { isLoading = true; this.someSevice.getSomeData().pipe( mergeMap(getUserData), mergeMap(getMetadata), ) .subscribe( response => { isLoading = false; }, error => { isLoading = false; this.errors = error; }, ); }
使用上面參考的stackoverflow鏈接中的答案,我不知道如何
A - 通過回圈動態插入合并映射,而不是將它們硬編碼
B - 將適當的引數傳遞給 mergeMaps(路由和引數)
我很感激任何幫助。謝謝。
uj5u.com熱心網友回復:
是你的意思嗎?如果您可以將 observable 放在陣列中,您可以使用reduce運算子按順序遍歷它們。
ngOnInit() {
const listOfString = ['item1', 'item2', 'item3', 'item4'];
listOfString
.slice(1, listOfString.length) // has to exclude the first item as we already defined it below
.reduce(
(a, b) => a.pipe(mergeMap((aResult) => this.getData(b, aResult))),
this.getData(listOfString[0], null) //first call
)
.subscribe();
}
getData(input: string, params: string): Observable<string> {
const result = `${input} ${params ? params : ''}`;
console.log(result);
return of(result);
}
uj5u.com熱心網友回復:
沒有減少的解決方案:
const {pipe, of} = rxjs;
const {mergeMap, tap} = rxjs.operators;
of({
initValue: 1,
sequence: [
value => of(value 2),
value => of(value * 2),
value => of(`result is: ${value}`),
],
})
.pipe(
mergeMap(({ initValue, sequence }) =>
of(initValue).pipe(
...sequence.map(stepFn => mergeMap(stepFn))
)
)
)
.subscribe(console.log);
<script src="https://unpkg.com/rxjs@^7/dist/bundles/rxjs.umd.min.js"></script>
uj5u.com熱心網友回復:
我不確定您在示例中的函式究竟是做什么的,但是如果getParamsFromResponse()回傳一個 Observable,您可以使用以下方法:
this.apiCall(route, params)
.pipe(
mergeMap(response =>
forkJoin(keys.map(key => this.populate(index 1, this.getParamsFromResponse(response))))
)
)
.subscribe(allResponses => /* one large array after all Observables completed */)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/350563.html
