3

上下文:为了使用 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 install & node version 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
4

3 回答 3

2

我认为您的问题是 generate 旨在创建一个有状态的 Observable 它将为第一个订阅者提供您生成的项目,但下一个订阅者将不会得到任何东西。看到这个 JSBin

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

于 2016-01-19T14:25:31.663 回答
0

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

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

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

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

于 2016-01-22T12:02:53.810 回答
0

正如评论中提到的,RxjsV4 似乎对generate操作员表现出与 Rxjsv2 不同的行为。

周转:

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

关于热与冷的解释here(官方文档)here(图解数据流)

于 2016-01-19T15:09:54.233 回答