【发布时间】:2015-03-23 14:56:32
【问题描述】:
我正在尝试使用 RxJS 复制 this demo。该演示是一个小型应用程序,用户在其中控制机器人。机器人可以向前或向后移动,向左或向右旋转,以及捡起或放下物品。用户可以对命令进行排队(例如“Forward”、“rotate”),当用户点击“Execute”按钮时,队列中的命令就会被执行。用户还可以撤消已经执行的命令。
传统上,这个应用程序很容易使用尚未执行的命令队列来实现。执行的命令被压入堆栈,每当按下撤消按钮时,顶部的命令就会弹出并撤消。
我可以通过这样做“收集”命令并执行它们:
var id = 0;
var add = Rx.Observable.fromEvent($("#add"), 'click').map(function(){
var ret = "Command_"+id;
id++;
return ret
})
var invoke = Rx.Observable.fromEvent($("#invoke"), 'click')
var invokes = add.buffer(invoke)
buffer() 方法将流转换为数组流。我可以订阅调用流并获取命令数组:
invokes.subscribe(function(command_array){...})
或者我可以创建一个 Rx.Subject() 来一一推送命令:
var invoked_commands = new Rx.Subject()
invokes.subscribe(function(command_array){
for(var i=0; i < command_array.length; i++){
invoked_commands.onNext(command_array[i])
}
});
invoked_commands.subscribe(function(command){ ...});
老实说,我不知道哪种方法会更好,但我又一次不知道这是否对我来说太相关了。我一直在试图弄清楚如何实现撤消功能,但我完全不知道该怎么做。
在我看来,它必须是这样的(对不起格式):
-c1---c2-c3--------->
----------------u---u-> ("u" = 点击撤消按钮)
----------------c3--c2>(从最新到最旧获取命令,调用undo()方法)
所以我的问题是双重的:
- 我收集命令的方法好吗?
- 如何实现撤消功能?
编辑:我正在比较变革风格和反应风格,并且我正在使用两者来实现这个演示。因此,我想尽可能坚持使用 Rx* 功能。
【问题讨论】:
-
事实证明,答案解决了一个稍微不同的问题。
标签: javascript system.reactive reactive-programming rxjs