如何枚举同步可观察对象?
How to enumerate a sync observable?
例如,如果您有一个 Observable from(['a', 'b'])
,如何获得一个发出 [0, 'a']
和 [1, 'b']
的 Observable?
我试过 from('a', 'b').pipe(zip(range(0, Number.POSITIVE_INFINITY)))
,但这会造成无限循环:如果您在控制台中尝试 Rx.Observable.from(['a', 'b']).zip(Rx.Observable.range(0, Number.POSITIVE_INFINITY)).do(console.log).subscribe()
(提示:页面 http://reactivex.io/rxjs/manual/overview.html 已经导入了 Rx),这将导致页面挂起(range
无限期地推送值)。在我的上下文中(使用 IndexedDB)我不能使用异步调度程序,而且无论如何从性能的角度来看它都没有意义。
我通过创建自定义运算符解决了这个问题
import { Observable } from 'rxjs/Observable';
import { map } from 'rxjs/operators';
export const enumerate = <T>(source: Observable<T>) => {
let index = 0;
return source.pipe(map(source => ({ value: source, index: index++ })));
};
但是我是否缺少更简单的解决方案?奇怪的是 RxJS 有这个陷阱...
许多运营商一直在为您计算 index
作为另一个参数传递给回调函数:
from(['a', 'b']).pipe(
map((value, index) => [ index, value ]))
);
或者如果你想发射物体:
map((value, index) => ({ index, value }))
例如,如果您有一个 Observable from(['a', 'b'])
,如何获得一个发出 [0, 'a']
和 [1, 'b']
的 Observable?
我试过 from('a', 'b').pipe(zip(range(0, Number.POSITIVE_INFINITY)))
,但这会造成无限循环:如果您在控制台中尝试 Rx.Observable.from(['a', 'b']).zip(Rx.Observable.range(0, Number.POSITIVE_INFINITY)).do(console.log).subscribe()
(提示:页面 http://reactivex.io/rxjs/manual/overview.html 已经导入了 Rx),这将导致页面挂起(range
无限期地推送值)。在我的上下文中(使用 IndexedDB)我不能使用异步调度程序,而且无论如何从性能的角度来看它都没有意义。
我通过创建自定义运算符解决了这个问题
import { Observable } from 'rxjs/Observable';
import { map } from 'rxjs/operators';
export const enumerate = <T>(source: Observable<T>) => {
let index = 0;
return source.pipe(map(source => ({ value: source, index: index++ })));
};
但是我是否缺少更简单的解决方案?奇怪的是 RxJS 有这个陷阱...
许多运营商一直在为您计算 index
作为另一个参数传递给回调函数:
from(['a', 'b']).pipe(
map((value, index) => [ index, value ]))
);
或者如果你想发射物体:
map((value, index) => ({ index, value }))