首页 > 解决方案 > 如何清除 .zip 队列?

问题描述

我基于 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$ 发出一个值时 - queue$ 都会用新值“重置”:

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

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

两个流 - Turn 和 Q

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

标签: javascriptrxjsgame-loop

解决方案


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


推荐阅读