RxJS пропускает значения при использовании combAll с 2 наблюдаемыми - PullRequest
1 голос
/ 15 марта 2019

Я пытаюсь создать оверты для симуляции матча в крикет со значениями следующим образом:

оверы -> 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

1 Ответ

2 голосов
/ 15 марта 2019

Вам даже не нужно использовать 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

...