如果这些事件之间的时间少于提供的时间,我想要做的就是获取大量的键盘事件。 也许那是不正确的方法,这就是为什么我仍然在同一个地方。
首先,我使用过滤器创建了简单的流,以捕获我感兴趣的每个事件。接下来,我制作了第二个流并将事件分组成对,我可以测量时间戳。似乎它工作得很好,但只有偶数个事件 - 所以在这段时间后我需要检查是否有东西在缓冲区中,如果它在那里我应该把它添加到我的字符串
代码:
int num1, num2, output;
string op;
Console.Write("\n\n");
Console.WriteLine("Calculator\n");
Console.WriteLine("=============");
Console.Write("\n\n");
Start:
do
{
Console.Write("Please enter valid first number:");
} while (!int.TryParse(Console.ReadLine(), out num1));
do
{
Console.Write("Please enter valid second number:");
} while (!int.TryParse(Console.ReadLine(), out num2));
Operator:
Console.WriteLine("Please select operator: ");
Console.WriteLine("\nAddition : +");
Console.WriteLine("Multiplication: *");
Console.WriteLine("Division: /");
Console.WriteLine("Subtraction: -");
Console.Write("Enter Operator: ");
op = Console.ReadLine();
switch (op)
{
case "+":
output = num1 + num2;
Console.WriteLine("{0} added to {1} = {2}", num1, num2, output);
break;
case "*":
output = num1 * num2;
Console.WriteLine("{0} multiplied by {1} = {2}", num1, num2, output);
break;
case "/":
if (num2 == 0)
{
Console.WriteLine("Cannot divide by zero. Please try again");
goto Start;
}
else
{
output = num1 / num2;
Console.WriteLine("{0} divided by {1} = {2}", num1, num2, output);
break;
}
case "-":
output = num1 - num2;
Console.WriteLine("{0} minus{1} = {2}", num1, num2, output);
break;
default:
Console.WriteLine("You entered an invalid operator. Please try again\n");
goto Operator;
}
Console.WriteLine("\nPress enter to continue....");
Console.ReadLine();
有没有办法让这个概念有效?或许还有更好的方法,我错过了。我也提出了其他概念,但他们产生了类似的结果。我当然可以让它以非反应方式工作并订阅主流 - 保存最后一个事件(如果存在)并将其与下一个等进行比较等等,但是因为我试图学习反应式编程我想做它尽可能多地反应。
答案 0 :(得分:0)
你的工作方式太难: - )
const timeout = 500;
keyDigitsUp$
.buffer(keyDigitsUp$.debounce(timeout))
.map(events => (events.length <= 1 ? '' : events.map(event => event.key).join(',')))
.subscribe(v => console.log('events for timeout ' + timeout + ' msec: '+ v));
这种方式的工作方式是,只有在没有按下任何键超时(本例中为500)mSecs时,它才会关闭缓冲区(即产生一个块)。
我不确定你想用密钥代码做什么,所以我只是用逗号分隔符连接它们。
请注意,rxjs 5语法可能略有不同。