我正在使用Rx来保留动画时钟。每个动画帧都会将间隔刻度映射到该刻度线的新值。
假设我想暂停动画。最自然的方式是以某种方式暂停时钟rx然后在以后恢复它。
取消订阅然后重新订阅并不自然,因为这个动画时钟是冷可观察的。我不想在他们恢复时重新启动动画。如果我寻求一种解决方法,我将不得不生成一个新的简历rx,这使得所有公开的API大大复杂化。
背压方法看起来并不乐观:
pause
不起作用,因为我想恢复离开的地方,而不是向前跳。换句话说,我不想在它关闭时丢掉滴答声。
pausableBuffered
无法正常工作,因为在恢复时,它会尽可能快地耗尽所有累积的滴答声。
使用某种虚拟时间调度程序可以完全停止时间然后恢复正常时间(?)
我在RxJS 5.0rc4上,但我也不知道如何在RxJS 4上执行此操作。任何一个版本的建议都将受到赞赏。
答案 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));
}
}