2017-07-31 71 views
2

如何在代碼中稍後創建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); 

回答

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

我假設這是因爲您正在使用rxjs版本^ 5.0.0並閱讀版本^ 4.0.0的文檔。

對於RxJs版本^5.0.0它是前人的精力,而不是observer.next(value)observer.onNext(value)

這裏您可以找到docs爲RxJs版本^5.0.0

+0

這絕對應該是一個評論,不是答案。 – DavidDomain