如何清除 .zip 队列?

How can I clear the .zip queue?

我基于 RxJS 制作了简单的 "game loop system",我在其中请求来自不同参与者(包括用户)的操作并将它们与 .zip 运算符合并。

结果是一个回合制游戏循环,它只为播放动画和请求用户操作而暂停。

由于该系统,用户可以对多个操作进行排队,系统会将它们存储在 .zip 运算符中。但是,如果用户决定改变主意,我想清除 "queue"。

我有一个fiddle: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$ 发出一个值 - queue$ 得到 'reset' 新值:

(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"]

编辑:这是我正在尝试做的图片:

两个流 - 转弯和 Q

Turn 应该以某种方式请求 A 和 B,并等待 Q 提供它的值(如果有的话)。当 Q 提供值时,Turn 等待一段时间然后重复。然而,Q 会按时间打破它的值(我猜是在 .window 的帮助下?)并在有新序列进入时丢弃任何未发送到 Turn 的值。

不确定我是否正确理解你的问题,但如果你想推迟触发队列(因为用户可能会改变 his/he 想法,那么你可以使用 debounceTime(1000),其中 1000 毫秒。
如果你想清除队列,你可以使用与 distinctUntilChanged 相同的运算符来识别更改并做你想做的事! 希望有帮助

我做到了!虽然我觉得这不是 RxJS 的方式,但至少它能按我的意愿工作。如果您有更好的解决方案 - 请 post,我对 "outside of stream" 变量和标志不是很满意。

我的方式是自己管理队列。并且在我需要输入时也有一个标志 - 如果整个链正在等待输入它是真的,否则不是。基于该标志,我要么将按下的键放入队列,要么直接发送到链。

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/