Нужен эксперт rxjs, чтобы решить эту загадочную загадку :) - PullRequest
3 голосов
/ 08 июля 2019

Мне действительно нужна помощь, чтобы разобраться с этой загадкой, с которой я столкнулся ... Я нарисую ее с точки зрения производства пончиков.(тот круг, который мы едим, когда у нас стресс)

Как и должно быть

В идеальном случае пользователь должен иметь возможность изменять настройки Factory & Toppingпончик.

Дело в том, что каждый раз, когда пончик импортируется, выбранная фабрика немедленно делает пончик с выбранной начинкой.

Продолжительность приготовления пончика варьируется.

Послепончик сделан, он будет храниться.

Теперь проблема, с которой я сталкиваюсь, заключается в том, что я не могу изменить Factory & Topping.(Это всегда значение по умолчанию N1, игра с кодами, приведенными ниже, должна помочь лучше объяснить загадку.)

Примечание

Последовательность имеет значение.Если пользователь вводит a, b, c, пончики должны быть ["N1a", "N1b", "N1c"], даже если для пончика определенного типа пончик требуется больше времени.Если пользователь вводит a, 2, i, j, k, 3, x, y, пончики должны быть ["N1a", "N2i", "N2j", "N2k", "N3x", "N3y"]

Вот код, который я разработал ниже, надеюсь, что эксперты rxjs найдут радость в решении этой проблемы, поскольку я уже съел слишком много пончиков, пытаясь решить эту проблему уже!

Код: https://stackblitz.com/edit/rxjs-uhqftu

import {
  fromEvent, combineLatest, of, concat, merge,
} from 'rxjs';
import {
  filter, tap, map, concatMap,
} from 'rxjs/operators';

console.log( 'Press arrow keys to change factory' );
console.log( 'Press [0-9] to change topping' );
console.log( 'Press [a-z] to import donuts' );

const donuts = [];

const allEvents$ = concat( of( 'ArrowUp', '1' ), fromEvent( document, 'keydown' ).pipe( map( event => event.key ) ) );

const factoryLocations = {
  ArrowUp: 'N',
  ArrowLeft: 'W',
  ArrowDown: 'S',
  ArrowRight: 'E',
};

const factoryEvent$ = allEvents$.pipe(
  filter( val => factoryLocations[ val ] ),
  map( val => factoryLocations[ val ] ),
  tap( x => console.log( `%c Change Factory ${ x }`, 'color: #e57373' ) )
);

const toppingEvent$ = allEvents$.pipe(
  filter( val => Number.isInteger( Number( val ) ) ),
  tap( x => console.log( `%c Change Topping ${ x }`, 'color: #f06292' ) )
);

const importDonutEvent$ = allEvents$.pipe(
  filter( val => !Number.isInteger( Number( val ) ) && !factoryLocations[ val ] ),
  tap( x => console.log( `%c Importing Donut ${ x }`, 'color: #f06292' ) )
);

const settingEvents$ = combineLatest( factoryEvent$, toppingEvent$ );

const processEvent$ = settingEvents$.pipe(
  concatMap( ( [ factory, topping ] ) => merge(
    importDonutEvent$
  ).pipe(
    map( type => ( { factory, topping, type } ) ),
  ) )
);

processEvent$.pipe(
  concatMap( ( { factory, topping, type } ) => makeDonut( factory, topping, type ) ),
).subscribe( donut => {
  console.log( `%c DONE   ${ donut }`, 'color: #4db6ac' );
  donuts.push( donut );
  console.log( donuts );
} );

function makeDonut ( factory, topping, type ) {
  const time = Math.random() * 3000;
  const donut = factory + topping + type;

  console.log( `%c MAKING ${ donut }`, 'color: #7986cb' );
  return new Promise( resolve => setTimeout( () => resolve( donut ), time ) );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...