RxJS:如何在Observable中包装诸如字符串之类的基本类型并监听对该原语的更改?
请考虑以下示例. setTimeout模拟一些更改字符串s的外部事件.但是,console.log仅触发一次而不是在调用setTimeout之后触发.这是为什么?
let s = "Hello World";
Observable.of(s).subscribe(val => {
console.log(val);
});
// some external event changes variable s
setTimeout( () => {
s = "Wat?";
}, 1000);
// Output: prints "Hello World" to console, but not "Wat?"
这个问题可能听起来有点愚蠢,但我通过各种RxJS文档和示例搜索了2个小时,其中大多数都使用数组或对象.这不是我想要的.我不想更改属性,函数,数组或类似的东西.只是一个普通的字符串或布尔或数字.
解决方法:
您正在考虑错误的流.流的重点是你不应该直接改变对象(字符串实际上不能像@Pointy已经提到的那样变异,但这是一个更普遍的观点).
您需要转变您的想法,将数据视为不可变,并将流视为表示您在订阅者中做出反应的更改.
在你的例子中,如果你想“改变”一个字符串,你真正要做的就是捕获一组更改并通过subscribe方法的下一个处理程序表示它们.这些变化的来源与字符串的观点无关,它只关心事件是通过它传递的.
即我可以执行以下操作以发出不同的字符串:
Rx.Observable.timer(1000)
.mapTo('Wat')
.startWith('Hello World!')
.subscribe(x => console.log(x));
您需要确定的是您的更改的来源以及应该发出的事件.从那里,Rx可以帮助您将这些数据按到您可以在下游使用的东西.