Как очистить очередь .zip? - PullRequest
       35

Как очистить очередь .zip?

0 голосов
/ 03 октября 2018

Я создал простую «систему игровых циклов», основанную на RxJS, где я запрашиваю действия у различных участников (включая пользователя) и объединяю их с оператором .zip.

Результатом является пошаговый игровой цикл, который приостанавливается только для анимации и запроса действий пользователя.

Благодаря этой системе пользователь может ставить в очередь несколько действий, и система будет сохранять их в.zip оператор.Однако я хочу очистить эту «очередь», если пользователь решит передумать.

У меня есть скрипка: https://jsfiddle.net/az5pthng/6/

Представьте, что пользователь вводит последовательность a1, a2, a3, a4,затем думает на секунду и решает изменить последовательность на b1, b2, b3, b4.Затем снова думает и набирает c1, c2, c3, c4.

В настоящее время у меня есть этот вывод, показывающий, что каждое нажатие клавиши записывается и воспроизводится:

(3) ["A", "B", "a1"]
(3) ["A", "B", "a2"]
1100
(3) ["A", "B", "a3"]
(3) ["A", "B", "a4"]
1723
(3) ["A", "B", "b1"]
(3) ["A", "B", "b2"]
(3) ["A", "B", "b3"]
(3) ["A", "B", "b4"]
(3) ["A", "B", "c1"]
(3) ["A", "B", "c2"]
(3) ["A", "B", "c3"]
(3) ["A", "B", "c4"]

Но я хочу этот вывод, указывая, чтовсякий раз, когда queueTime $ выдает значение - очередь $ получает «сброс» с новыми значениями:

(3) ["A", "B", "a1"]
(3) ["A", "B", "a2"]
1100
(3) ["A", "B", "b1"]
(3) ["A", "B", "b2"]
1700
(3) ["A", "B", "c1"]
(3) ["A", "B", "c2"]
(3) ["A", "B", "c3"]
(3) ["A", "B", "c4"]

РЕДАКТИРОВАТЬ: Вот картинка, которую я пытаюсь сделать: scheme

Два потока - Turn и Q

Turn должен как-то запрашивать A и B и ждать, пока Q предоставит его значение, если оно есть.Когда Q предоставляет значение, Turn ждет некоторое время, а затем повторяется.Q, однако, разбивает его значения по времени (я думаю, с помощью .window?) И отбрасывает все значения, которые не отправляются в Turn, если поступает новая последовательность.

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Я сделал это!Хотя я чувствую, что это не так, как RxJS, но, по крайней мере, работает так, как я хочу.Если у вас есть лучшее решение - пожалуйста, пишите, я не очень доволен наличием переменных и флагов "вне потока".

Мой способ - управлять очередью самостоятельно.А также есть флаг всякий раз, когда мне нужен ввод - если вся цепочка ожидает ввода, это правда, в противном случае нет.Основываясь на этом флаге, я либо помещаю нажатую клавишу в очередь, либо отправляю в цепочку напрямую.

input$.subscribe(({value, interval}) => {
    if (waitingForInput) {
    queue$.next(value);
    waitingForInput = false;
  } else {
    if (interval < DEBOUNCE_TIME) {
        queue.push(value);
    } else {
        queue.length = 0;
        queue.push(value);
    }
  }
});

И:

// Request action from other entites
const requestAction = (x) => Rx.of(x);
// Request action from player
const requestQueueAction = () => {
    if (queue.length > 0) {
    return Rx.of(queue.shift());
  } else {
    waitingForInput = true;
    return queue$.pipe(op.take(1));
  }
}

Вот код: https://jsfiddle.net/az5pthng/7/

0 голосов
/ 05 октября 2018

Не уверен, правильно ли я понимаю ваш вопрос, но если вы хотите отложить очередь на триггер (поскольку пользователь может передумать, вы можете использовать debounceTime (1000) , где 1000 в мс.
Если вы хотите очистить очередь, вы можете использовать тот же оператор с diverUntilChanged , чтобы распознать изменения и сделать то, что вы когда-либо хотели сделать! Надеюсь, это поможет

...