使用combineAll和2个observable时,RxJS缺少值

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

我正试图为板球比赛模拟生成过多的值,如下所示:

Overs - > 0 - 19(总共20次) 球 - > 1 - 6(总共120,每个球有6个球)

因此,必须生成的序列将类似于0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 1.1, 1.2, 1.3, ....., 19.4, 19.5, 19.6

我可以通过使用2个嵌套循环迭代来轻松实现这一点,但由于我在RxJS中使用angular,我想以反应方式执行此操作。我想出了以下代码,它应该适用于AFAIK:

import { range } from 'rxjs';
import { map, combineAll } from 'rxjs/operators';

let overs = range(0, 20);

let balls = range(1, 6);

let ob = overs.pipe(
  map((over) => balls.pipe(
    map((ball) => `${over}.${ball}`)
  ))
).pipe(combineAll())

ob.subscribe((val) => console.log(val));

但问题是,它缺少很多价值。我得到以下输出:

[ '0.6',
  '1.6',
  '2.6',
  '3.6',
  '4.6',
  '5.6',
  '6.6',
  '7.6',
  '8.6',
  '9.6',
  '10.6',
  '11.6',
  '12.6',
  '13.6',
  '14.6',
  '15.6',
  '16.6',
  '17.6',
  '18.6',
  '19.1' ]
[ '0.6',
  '1.6',
  '2.6',
  '3.6',
  '4.6',
  '5.6',
  '6.6',
  '7.6',
  '8.6',
  '9.6',
  '10.6',
  '11.6',
  '12.6',
  '13.6',
  '14.6',
  '15.6',
  '16.6',
  '17.6',
  '18.6',
  '19.2' ]
[ '0.6',
  '1.6',
  '2.6',
  '3.6',
  '4.6',
  '5.6',
  '6.6',
  '7.6',
  '8.6',
  '9.6',
  '10.6',
  '11.6',
  '12.6',
  '13.6',
  '14.6',
  '15.6',
  '16.6',
  '17.6',
  '18.6',
  '19.3' ]
[ '0.6',
  '1.6',
  '2.6',
  '3.6',
  '4.6',
  '5.6',
  '6.6',
  '7.6',
  '8.6',
  '9.6',
  '10.6',
  '11.6',
  '12.6',
  '13.6',
  '14.6',
  '15.6',
  '16.6',
  '17.6',
  '18.6',
  '19.4' ]
[ '0.6',
  '1.6',
  '2.6',
  '3.6',
  '4.6',
  '5.6',
  '6.6',
  '7.6',
  '8.6',
  '9.6',
  '10.6',
  '11.6',
  '12.6',
  '13.6',
  '14.6',
  '15.6',
  '16.6',
  '17.6',
  '18.6',
  '19.5' ]
[ '0.6',
  '1.6',
  '2.6',
  '3.6',
  '4.6',
  '5.6',
  '6.6',
  '7.6',
  '8.6',
  '9.6',
  '10.6',
  '11.6',
  '12.6',
  '13.6',
  '14.6',
  '15.6',
  '16.6',
  '17.6',
  '18.6',
  '19.6' ]

正如人们可以观察到的那样,所有的过度都会产生(0-19),但我们只得到每个的.6值。只有最后一次,即19th具有独特的价值19.1, 19.2...

我在这段代码中缺少什么?

此外,如果它有帮助,这里是上述代码的repl,以防你想尝试在浏览器中进行实验:https://repl.it/@ishankhare07/cricket-overs

typescript rxjs observable rxjs-pipeable-operators
1个回答
2
投票

你甚至不需要使用combineAll并使用mergeMap代替它,这使它更容易理解。

import { range } from 'rxjs';
import { map, mergeMap } from 'rxjs/operators';

let overs = range(0, 20);
let balls = range(1, 6);

let ob = overs.pipe(
  mergeMap((over) => balls.pipe(
    map((ball) => `${over}.${ball}`),
  )),
); 

ob.subscribe((val) => console.log(val));

现场演示:https://stackblitz.com/edit/rxjs-aud3ot

© www.soinside.com 2019 - 2024. All rights reserved.