RxJS(5.0rc4):暂停并恢复间隔计时器

时间:2016-11-28 06:28:53

标签: rxjs rxjs5

我正在使用Rx来保留动画时钟。每个动画帧都会将间隔刻度映射到该刻度线的新值。

假设我想暂停动画。最自然的方式是以某种方式暂停时钟rx然后在以后恢复它。

取消订阅然后重新订阅并不自然,因为这个动画时钟是冷可观察的。我不想在他们恢复时重新启动动画。如果我寻求一种解决方法,我将不得不生成一个新的简历rx,这使得所有公开的API大大复杂化。

背压方法看起来并不乐观:

pause不起作用,因为我想恢复离开的地方,而不是向前跳。换句话说,我不想在它关闭时丢掉滴答声。

pausableBuffered无法正常工作,因为在恢复时,它会尽可能快地耗尽所有累积的滴答声。

使用某种虚拟时间调度程序可以完全停止时间然后恢复正常时间(?)

我在RxJS 5.0rc4上,但我也不知道如何在RxJS 4上执行此操作。任何一个版本的建议都将受到赞赏。

2 个答案:

答案 0 :(得分:5)

switchMap信息流上使用pauser在原始资源和Observable.never之间进行选择。如果您不希望计时器向前跳,请自行管理(使用下面的x变量)。

function pausableInterval(ms, pauser) {
  let x = 0;
  const source = IntervalObservable.create(ms);

  return pauser.switchMap(paused => paused ? Observable.never() : source.map(() => x++);
}

pauser流应该发出布尔值。

未经测试。

答案 1 :(得分:1)

使用torazaburo的想法让我获得95%的胜利。最后一步是我需要x封闭对每个订阅都是唯一的。 Observable.create是我为每个订阅创建闭包所需要的。

public class NumberToWord  

{
    private static final String[] specialNames = {
        "",
        " thousand",
        " million",
        " billion",
        " trillion",
        " quadrillion",
        " quintillion"
    };

    private static final String[] tensNames = {
        "",
        " ten",
        " twenty",
        " thirty",
        " forty",
        " fifty",
        " sixty",
        " seventy",
        " eighty",
        " ninety"
    };

    private static final String[] numNames = {
        "",
        " one",
        " two",
        " three",
        " four",
        " five",
        " six",
        " seven",
        " eight",
        " nine",
        " ten",
        " eleven",
        " twelve",
        " thirteen",
        " fourteen",
        " fifteen",
        " sixteen",
        " seventeen",
        " eighteen",
        " nineteen"
    };

    private String convertLessThanOneThousand(int number) {
        String current;

        if (number % 100 < 20){
            current = numNames[number % 100];
            number /= 100;
        }
        else {
            current = numNames[number % 10];
            number /= 10;

            current = tensNames[number % 10] + current;
            number /= 10;
        }
        if (number == 0) return current;
        return numNames[number] + " hundred" + current;
    }

    public String convert(int number) {

        if (number == 0) { return "zero"; }

        String prefix = "";

        if (number < 0) {
            number = -number;
            prefix = "negative";
        }

        String current = "";
        int place = 0;

        do {
            int n = number % 1000;
            if (n != 0){
                String s = convertLessThanOneThousand(n);
                current = s + specialNames[place] + current;
            }
            place++;
            number /= 1000;
        } while (number > 0);

        return (prefix + current).trim();
    }

    public static void main(String[] args) {
        NumberToWord obj = new NumberToWord();
        System.out.println("*** " + obj.convert(123456789));
        System.out.println("*** " + obj.convert(-55));
    }
}
相关问题