javascript – RxJS:如何包装和观察字符串的变化?

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可以帮助您将这些数据按到您可以在下游使用的东西.

上一篇:javascript – 为什么RxJS函数toPromise不会取消订阅


下一篇:javascript – 一旦Rx.Observable发生错误,ValueChanges就会停止工作