我已经创建了一个基于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"]
两个流-转弯和Q
Turn应该以某种方式请求A和B,然后等待Q提供它的值(如果有)。当Q提供值时,Turn等待一段时间,然后重复。但是,Q会按时间打破它的值(我想借助.window吗?),并且如果有新序列进入,则丢弃任何未发送到Turn的值。
答案 0 :(得分:0)
不确定我是否正确理解了您的问题,但是不确定是否要推迟触发队列(由于用户可能改变了主意,则可以使用debounceTime(1000),其中以毫秒为单位。
如果要清除队列,可以将同一运算符与distinctUntilChanged一起使用,以识别更改并执行您想做的一切!
希望有帮助
答案 1 :(得分:0)
我做到了!虽然我觉得这不是RxJS方式,但至少它可以按我的意愿工作。如果您有更好的解决方案-请发布,我对拥有“流外”变量和标志不满意。
我的方法是自己管理队列。每当我需要输入时也要有一个标志-如果整个链都在等待输入,则为true,否则为true。基于该标志,我可以将按下的键放入队列或直接发送到链。
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));
}
}