我有一個可觀察的問題。我準備了stackblitz來簡化我的問題。
我有 2 個 observables (obs1$, obs2$) 和數字陣列。我想等待 obs1$ 完成,然后回圈遍歷陣列并回傳每個元素的 observable,運行 obs2$。
下面是函式代碼:
oneByOneObservables(): Observable<unknown> {
const obs1$ = of(1, 2, 3);
const arr = [4, 5, 6];
const obs2$ = of(7, 8, 9);
return obs1$.pipe(
concat(() => arr.map((item) => of(item))),
() => obs2$
);
}
我有一個錯誤:
沒有過載匹配此呼叫。最后一次多載出現以下錯誤。'() => Observable[]' 型別的引數不可分配給型別 'SchedulerLike | 的引數 可觀察輸入'。屬性 '[Symbol.iterator]' 在型別 '() => Observable[]' 中缺失,但在型別 'Iterable' 中是必需的。
感謝幫助
uj5u.com熱心網友回復:
所以這將奏效。我添加了一些日志來跟蹤它。
這里也是Stackblitz。
import { Component } from '@angular/core';
import { ChangeDetectionStrategy } from '@angular/core';
import { Observable, of, forkJoin } from 'rxjs';
import { concatMap, tap, last } from 'rxjs/operators';
@Component({
selector: 'my-app',
styleUrls: ['./app.component.scss'],
templateUrl: './app.component.html',
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class AppComponent {
oneByOneObservables(): Observable<unknown> {
const obs1$ = of(1, 2, 3).pipe(tap((v) => console.log('Obs1', v)));
const arr = [4, 5, 6];
const obs2$ = of(7, 8, 9);
return obs1$.pipe(
last(),
tap((v) => console.log('Obs1 last value', v)),
concatMap(() => forkJoin(arr.map((item) => of(item)))),
tap((v) => console.log('Array of observables value', v)),
concatMap(() => obs2$),
tap((v) => console.log('Obs2 value', v))
);
}
}
uj5u.com熱心網友回復:
繼承人一些代碼:
- 等待 obs1$ 完成 ?
- 然后回圈遍歷陣列并回傳每個元素的 observable ? (目前這是一個浪費幾個 cpu 周期的 noop。創建一個 observable 并沒有做任何事情,你打算訂閱這些嗎?按順序?一次性?由你決定, 我猜)
- 運行 obs2$ ?
function oneByOneObservables(): Observable<number> {
const obs1$ = of(1, 2, 3);
const arr = [4, 5, 6];
const obs2$ = of(7, 8, 9);
return obs1$.pipe(
concatWith(defer(() => {
arr.map((item) => of(item))
return obs2$
}))
);
}
oneByOneObservables().subscribe(console.log);
輸出:
1
2
3
7
8
9
一個又一個訂閱可觀察物件陣列的示例。
function oneByOneObservables(): Observable<number> {
const obs1$ = of(1, 2, 3);
const arr = [4, 5, 6];
const obs2$ = of(7, 8, 9);
return obs1$.pipe(
concatWith(defer(() =>
concat(...arr.map((item) => of(item)))
)),
concatWith(obs2$)
);
}
oneByOneObservables().subscribe(console.log)
輸出:
1
2
3
4
5
6
7
8
9
uj5u.com熱心網友回復:
你可以用switchMap嗎?雖然我不確定您正在尋找的可觀察量的輸出是什么。
oneByOneObservables(): Observable<unknown> {
const obs1$ = of(1, 2, 3);
const arr = [4, 5, 6];
const obs2$ = of(7, 8, 9);
return obs1$.pipe(
concat(() => arr.map((item) => of(item))),
switchMap(() => obs2$)
);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/390667.html
標籤:有角的 rxjs 级联 rxjs-observables
上一篇:更改行內日期選擇器角度材料的標題
