问题描述
我正在尝试从数组的 observable 进行转换:
of([1,2,3]);
进入一个可观察的数组:
[ of(1),of(2),of(3) ]
但我没有想法。我尝试了以下方法:
of([1,3]).pipe(map((elements: number[]) => elements.map(element => of(element)))
但这给了我这样的东西,有一个我不想要的外部可观察对象。
of([ of(1),of(3) ])
因为我想将结果与其他数组连接起来,所以我只订阅外部 observable 来获取数组并不方便……我想我需要一个相反的 concatAll
运算符。有什么想法吗?
解决方法
如果你知道 observable 总是完全同步的 (但请记住,这并不是您可以在运行时检查的内容),您 可以这样做:
const extractValue = <T>(source$: Observable<T[]>): Observable<T>[] => {
let result: Observable<T>[];
source$
.pipe(
map((arr) => arr.map((value) => of(value))),take(1)
)
.subscribe((_result) => {
result = _result;
});
return result;
};
否则,您必须使用异步函数:
const extractValue = <T>(
source$: Observable<T[]>
): Promise<Observable<T>[]> => {
return source$
.pipe(
map((arr) => arr.map((value) => of(value))),take(1)
)
.toPromise();
};
,
RxJS#from
from([1,2,3,4,5]).subscribe(console.log) // 1 2 3 4 5
或作为可管道操作符
of([1,5]).pipe(
concatMap(v => from(v))
).subscribe(console.log) // 1 2 3 4 5
将其与您的转换相结合
of([1,5]).pipe(
map((elements: number[]) =>
elements.map(element => of(element))
),concatMap(x => from(x))
)
结合
of([1,5]).pipe(
concatMap((elements: number[]) =>
from(elements.map(element => of(element)))
)
)
,
也许您可以尝试从数组创建一个 Observable,然后使用 of() 函数将每个成员转换为 Observable:
const arr = [1,3];
from(arr).pipe(
mergeMap((a) => of(a))
);
之后,您可以随意处理每个 observable。