将 combineAll 与 2 个可观察对象一起使用时,RxJS 缺少值
RxJS missing values when using combineAll with 2 observables
我正在尝试为板球比赛模拟生成轮值如下:
轮数 -> 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 个嵌套循环进行迭代来轻松实现这一点,但是由于我使用 angular 和 RxJS,所以我想以反应的方式来做到这一点。我想出了以下应该可以工作的代码 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...
我在这段代码中遗漏了什么?
另外,如果它对上面的代码有帮助,如果你想在浏览器中尝试和试验它的话:https://repl.it/@ishankhare07/cricket-overs
您甚至不需要使用 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));
我正在尝试为板球比赛模拟生成轮值如下:
轮数 -> 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 个嵌套循环进行迭代来轻松实现这一点,但是由于我使用 angular 和 RxJS,所以我想以反应的方式来做到这一点。我想出了以下应该可以工作的代码 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...
我在这段代码中遗漏了什么?
另外,如果它对上面的代码有帮助,如果你想在浏览器中尝试和试验它的话:https://repl.it/@ishankhare07/cricket-overs
您甚至不需要使用 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));