如何枚举同步可观察?

问题描述 投票:2回答:1

例如,如果你有一个可观察的from(['a', 'b']),如何得到一个发出[0, 'a'][1, 'b']的观察者?

我尝试过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有这个问题,这很奇怪......

typescript rxjs rxjs5
1个回答
4
投票

许多运算符为你计算index,它作为另一个参数传递给回调函数:

from(['a', 'b']).pipe(
  map((value, index) => [ index, value ]))
);

或者,如果要发出对象:

map((value, index) => ({ index, value }))
© www.soinside.com 2019 - 2024. All rights reserved.