Rxjs merge() 不起作用

Rxjs merge() not working

本文关键字:不起作用 merge Rxjs      更新时间:2023-09-26

上下文:为了使用 JSON 树生成 swift 代码,我正在以预购格式遍历树,向下到达所有叶节点,有效地将树扁平化为数组。

描述:使用 Rx.Observable.generate() 从数组元素创建一个可观察的流,但在过滤时我得到了一些奇怪的结果。我在下面提供了一个归结的例子:

例:

var Rx = require('/usr/local/lib/node_modules/rx') // 4.0.7
// source 1,3,5,7,9 (WAT)
var source = Rx.Observable.generate(
    0,
    function (x) { return x < 10; },
    function (x) { return x + 1; },
    function (x) { return x; }
)
// filter & merge
var a = source.filter(x => x % 2 == 0)
var b = source.filter(x => x % 2 != 0)
var source = a.merge(b)
// subscribe & output
var subscription = source.subscribe(
    x => console.log(x)
)

问:为什么我得到的输出结果

是 1,3,5,7,9 而不是预期的 0,1,2,3,4,5,6,7,8,9?

我应用合并的方式似乎并不重要......反转时,我还得到输出 0,2,4,6,8。

编辑,npm 安装和节点版本用户3743222:感谢您的反馈,有关项目的信息如下:

$ npm install
chai@3.4.1 node_modules/chai
├── assertion-error@1.0.1
├── type-detect@1.0.0
└── deep-eql@0.1.3 (type-detect@0.1.1)
moment@2.11.1 node_modules/moment
mocha@2.3.4 node_modules/mocha
├── escape-string-regexp@1.0.2
├── diff@1.4.0
├── commander@2.3.0
├── supports-color@1.2.0
├── growl@1.8.1
├── debug@2.2.0 (ms@0.7.1)
├── jade@0.26.3 (commander@0.6.1, mkdirp@0.3.0)
├── mkdirp@0.5.0 (minimist@0.0.8)
└── glob@3.2.3 (inherits@2.0.1, graceful-fs@2.0.3, minimatch@0.2.14)
rx@4.0.7 node_modules/rx

$ node --version
v4.2.1

我认为您的问题是 generate 旨在创建一个有状态的可观察对象,这将为第一个订阅者提供您生成的项目,但下一个订阅者不会得到任何东西。请参阅此 JSBin

例如,如果您使用使用 range 创建的普通可观察量,您将获得所需的合并结果。请参阅此 JSBin

如评论中所述,对于generate运算符,RxjsV4 似乎表现出与 Rxjsv2 不同的行为。

周转:

  • 降级版本
  • 使用 defer 重新启动源 参见 http://jsfiddle.net/fz3LL7e5/1/在这种情况下,这将有效,但不一定在所有情况下都有效。
  • 实际上我认为您想要使用share因为您希望下游可观察对象看到相同的值,对吗? 而不是重新启动生成。 参看 http://jsfiddle.net/fz3LL7e5/2/这按预期工作。

关于热与冷的解释在这里(官方文档)和这里(图解数据流)

我做了一些摆弄,尝试了不同的方法来创建事件流

我喜欢使用 from 类似数组的选项,其中您传递给 from() 的对象必须具有公共长度属性。不确定这是否是因为它已编入索引。

var E = Rx.Observable.from(arrayLike,
    function (_, i) {
        return i
    })

此处显示的工作:http://jsfiddle.net/th3caaaz/