Rxjs 自定义可观察对象无法链接

Rxjs 自定义可观察对象无法链接,rxjs,Rxjs,我试图创建一个定制的可观察操作符“write”,它将链接到一个可观察流并输出可观察流的内容 以下代码起作用: RX.Observable.write = function() { return RX.Observable.create(function (observer) { try{ observer.onNext("this is a test message"); observer.onCompleted();

我试图创建一个定制的可观察操作符“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
var observable=RX.observable.range(0,5.write();
^
TypeError:对象#没有“写入”方法
反对。(/Users/ericbroda/Development/rxstream/index.js:15:43)
在模块处编译(Module.js:456:26)
在Object.Module.\u extensions..js(Module.js:474:10)
在Module.load(Module.js:356:32)
在Function.Module.\u加载(Module.js:312:12)
位于Function.Module.runMain(Module.js:497:10)
启动时(node.js:119:16)
在node.js:906:3
也许有一件简单的事情我错过了,但我现在想不起来了


非常感谢您的帮助。

您正在对Rx.Observable对象进行写操作,实质上创建了一个静态方法。如果您希望它在链的中间工作,则需要将其添加到原型“Rx.Vistaby.Trime.Script”。 尽管如此,这可能不会像您希望的那样表现。它将忽略传入的
RangeObservable
,完成后只返回“这是一条测试消息”。因此,在实例方法中,您需要处理传入的可观察对象,即
this

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

为了完整起见,我想发布我制定的最终解决方案——我现在可以使用RX observable模式将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');
        };
    });
};
上述“可写”观察值可按如下方式使用。该示例使用一个节点应用程序进行说明,该节点应用程序将可观察流写入节点的stdout以供说明,但可以使用任何流,如文件(注意:您需要以适当的方式处理编码)。这使得使用常规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);
} );