RxJS - 如何在缓冲区中手动发出缓冲区/查看元素

时间:2016-09-13 06:20:49

标签: javascript reactive-programming rxjs5

如果这些事件之间的时间少于提供的时间,我想要做的就是获取大量的键盘事件。 也许那是不正确的方法,这就是为什么我仍然在同一个地方。

首先,我使用过滤器创建了简单的流,以捕获我感兴趣的每个事件。接下来,我制作了第二个流并将事件分组成对,我可以测量时间戳。似乎它工作得很好,但只有偶数个事件 - 所以在这段时间后我需要检查是否有东西在缓冲区中,如果它在那里我应该把它添加到我的字符串

代码:

     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();

有没有办法让这个概念有效?或许还有更好的方法,我错过了。我也提出了其他概念,但他们产生了类似的结果。我当然可以让它以非反应方式工作并订阅主流 - 保存最后一个事件(如果存在)并将其与下一个等进行比较等等,但是因为我试图学习反应式编程我想做它尽可能多地反应。

1 个答案:

答案 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));

查看working jsbin

这种方式的工作方式是,只有在没有按下任何键超时(本例中为500)mSecs时,它才会关闭缓冲区(即产生一个块)。

我不确定你想用密钥代码做什么,所以我只是用逗号分隔符连接它们。

请注意,rxjs 5语法可能略有不同。