将观察者存储在全局变量中并在以后使用它

时间:2017-07-31 18:41:18

标签: javascript node.js rxjs

如何在代码中创建一个observable并在后面生成下一个值?我希望能够通过其他异步事件从代码的不同部分调用onNext。

这是我尝试过的,但不起作用:

var Rx = require('rx');

var GlobalObserver;

var source = Rx.Observable.create(observer => {
    GlobalObserver = observer;
});

var subscription = source.subscribe(
    x => console.log('onNext: %s', x),
    e => console.log('onError: %s', e),
    () => console.log('onCompleted')
);

//...later in the code, as a result of another async event:


    GlobalObserver.onNext(someData);
    ...
    GlobalObserver.onNext(someOtherData);

2 个答案:

答案 0 :(得分:4)

您需要的是某种主题。 ReplaySubjectBehaviorSubjectSubject

创建主题,然后您可以subject.subscribe(...)订阅它。您也可以subject.onNext(...)添加到流中。

例如:

var subject = new Rx.Subject();

var subscription = subject.subscribe(
    function (x) { console.log('onNext: ' + x); },
    function (e) { console.log('onError: ' + e.message); },
    function () { console.log('onCompleted'); }
);

subject.onNext(1);
// => onNext: 1

subject.onNext(2);
// => onNext: 2

subject.onCompleted();
// => onCompleted

subscription.dispose();

更具体的用例(每次成功的HTTP响应返回时都会添加到可观察流中):

var httpResponseStream = new Rx.Subject();

var subscription = httpResponseStream.subscribe(function (response) { 
    console.log('HTTP response success: ', response); 
});

makeAJAXCall().then(function (response) {
    httpResponseStream.onNext(response);
});

正如其他用户所述,如果您使用的是V5,请确保将所有onNext更改为next。如果您使用的是V4,请坚持onNext

答案 1 :(得分:1)

我假设它是因为您正在使用rxjs版本^ 5.0.0并阅读版本^ 4.0.0的文档。

对于 RxJs 版本^5.0.0,它应该是observer.next(value)而不是observer.onNext(value)

在这里,您可以找到RxJs版本^5.0.0

docs