自定义observable无法链接

时间:2015-06-15 16:12:13

标签: rxjs

我正在尝试创建一个自定义的可观察运算符" write",它将链接到一个可观察的流并输出可观察流的内容。

以下代码有效:

RX.Observable.write = function() {
    return RX.Observable.create(function (observer) {
        try{
            observer.onNext("this is a test message");
            observer.onCompleted();
        } catch(exception){
            observer.onError(exception);
        }
    });
};

var observable = RX.Observable.write(); 
var subscription = observable.subscribe( function (x) { 
    console.log(x);
} );

但是下面的代码添加了"范围(0,5)"不起作用并踢出一个例外:

var observable = RX.Observable.range(0,5).write();  
                                          ^
TypeError: Object #<RangeObservable> has no method 'write'
    at Object.<anonymous> (/Users/ericbroda/Development/rxstream/index.js:15:43)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)
    at startup (node.js:119:16)
    at node.js:906:3

我可能遗漏了一件简单的事情,但现在却让我失望了。

感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

您正在将写入放在Rx.Observable对象上,实质上是创建一个静态方法。如果您希望它在链中间工作,您需要将其添加到原型&#39; Rx.Observable.prototype.write&#39;。

即便如此,这可能也不会像你想要的那样。它会忽略传入的RangeObservable并简单地返回&#34;这是一条测试消息&#34;一旦完成。因此,在实例方法中,您需要处理传入的Observable,即this

Rx.Observable.prototype.write = function() {
  var source = this;
  return source.map(/*Do something with incoming data*/);
};

答案 1 :(得分:0)

为了完整性,我想发布我解决的最终解决方案 - 我现在可以使用RX可观察模式将一个observable写入节点流:

var RX = require("rx");
var util = require('util');

RX.Observable.prototype.write = function(stream, encoding, cb) {

    var source = this;

    return new RX.AnonymousObservable(function(observer) {

        return source.subscribe (
            function(x) { 
                observer.onNext(x);
                stream.write(x, encoding, cb(data));
            },
            function(e) {
                observer.onError(e);
            },
            function() {
                observer.onCompleted();
            }, 
            source);

        return function() {
            // console.log('disposed');
        };
    });
};

上述“可写”可观察量可以如下使用。该示例使用节点应用程序将可观察流写入节点的标准输出以用于说明目的,但是可以使用任何流(例如文件)(注意:您将需要以适当的方式解决编码)。这使得使用常规RX可观察模式编写可观察对象非常简单。

var RX = require("rx");
var util = require('util');

var observable = RX.Observable.range(0,5).write(process.stdout, 'utf8', function(x){
    console.log("stream completion callback called, x: %s", x);
});

var subscription = observable.subscribe( function (x) { 
    console.dir(x);
} );