Rxjs merge()不起作用

时间:2016-01-19 09:24:27

标签: javascript node.js rxjs reactivex

上下文:要使用JSON树生成快速代码,我将以预先顺序格式遍历树,向下到达所有叶节点,有效地将树展平为数组。

描述:使用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 install&amp;节点版本 user3743222:感谢您的反馈,项目信息如下:

$ 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

3 个答案:

答案 0 :(得分:2)

我认为你的问题是,生成是为了创建一个有状态的Observable,它将为第一个订阅者提供生成的项目,但是下一个订阅者将无法获得任何内容。 See this JSBin

例如,如果您使用使用range创建的普通Observable,您将获得正在寻找的合并结果。 See this JSBin

答案 1 :(得分:0)

正如评论中所提到的,对于generate运算符,Rxj​​sV4似乎表现出与Rxjsv2不同的行为。

周转时间:

  • 降级版
  • 使用defer重新启动源Cf. http://jsfiddle.net/fz3LL7e5/1/这将适用于这种情况,但不一定适用于所有情况。
  • 实际上我认为您想要使用的是share ,因为您希望下游的observable看到相同的值吗?而不是重新启动一代。参看http://jsfiddle.net/fz3LL7e5/2/这可以按预期工作。

关于热与冷here (official documentation)here (illustrated dataflows)

的说明

答案 2 :(得分:0)

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

我喜欢使用from array-like选项,其中从()传递的对象必须具有公共 length 属性。不确定这是否是因为它已编入索引。

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

显示在这里工作:http://jsfiddle.net/th3caaaz/