如何清除 .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));
}
}
我基于 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));
}
}