2016-01-06 126 views
0

因此,我有一個可觀察的事件,它使HTTP帖子從服務器獲取訪問令牌。我有另一個執行到同一臺服務器,但需要從第一個訪問令牌存在。所以我希望能夠在兩個不同的地方同時訂閱兩個可觀察對象,但是GET可觀察對象當然必須等待POST可觀察對象。我如何在另一個Observable訂閱完成時觀察到等待?RxJS Observable等待Observable

回答

0

不知道我是否理解,但這裏有一個選項。假設postHttp$是你的訪問令牌獲取可觀的,並且getFromServer$一個執行到達服務器,並假設那些只有一個值的序列(即承諾樣):

  • postHttp$.flatMap(function (authToken){return $.ajax(...)})將等待postHttp有產生承諾的價值將被平攤到其解決的價值。即the GET observable (...) wait on the POST observable.要檢索該值,您可以訂閱observable,或繼續鏈接其他操作符。
    • flatMap接受promises作爲其選擇函數參數的返回值,所以在這裏不需要轉換爲Rx.Observable

這就是你想要的嗎?

-1

我想出了一個解決方案,所以我想我會繼續併發布我自己的答案。如果有人知道更有效的做事方式,肯定會發表一個答案,我會接受它!

this.getObservable = Rx.Observable.create(function(observer){ 
    this.postObservable.subscribe(null, null, function onComplete(){ 
    var ajaxObservable = Rx.Observable.fromPromise($.ajax({ 
     url: this.apiPath, 
     method: 'GET', 
     beforeSend: function (xhr) { 
     // this.authToken is created by the postObservable, so we have to subscribe to the oncomplete of that in order to use it. 
     xhr.setRequestHeader('Authorization', this.authToken); 
     }.bind(this) 
    }).promise()); 
    ajaxObservable.subscribe(
     function onNext(data){ 
     observer.next(data); 
     }, 
     function onError(error){ 
     observer.error(error); 
     }, 
     function onComplete(){ 
     observer.complete(); 
     } 
    ); 
    }.bind(this)); 
}.bind(this)); 

在這段代碼,getObservable訂閱postObservable,只有一次是完成這有它自己的Ajax調用。這很有用,因爲它可以讓我的頁面立即訂閱他們想要的任何GET觀察值,而不必擔心先訂閱postObservable的回調地獄,然後在準備就緒時下載到下一個觀察值。對於單個頁面,發佈請求是完全隱藏的,他們只是訂閱獲取請求。

請注意,此代碼可能會更清潔箭頭功能,但我試圖保持與一些舊瀏覽器兼容。

+0

重要的是,它適合你。然而:1.如果你必須鏈接一系列可觀察的事件,那麼它不會是回調地獄,但它將會是地獄,2.這些機制(操作的順序)已經在Rx操作符中實現了,最好的是重用和組合現有的代碼,這是廣泛測試。 3.一般來說,最好是在功能上進行編程,即儘可能多地使用純函數(無副作用),這會簡化你的推理和測試(我在這裏理解'postObservable'以某種方式修改'authToken') – user3743222

+0

你真的只是在做'this.postObservable.flatMap(function(authToken){return $ .ajax(...)})''。然後你可以訂閱它來處理來自ajax調用的數據。我會更新我的答案以反映新信息。我建議您閱讀本文以進一步瞭解Rxjs:https://gist.github.com/staltz/868e7e9bc2a7b8c1f754 – user3743222

+0

@ user3743222有趣的。你認爲你可以更新你的答案來反映這個評論嗎?如果你可以用上面給出的變量來表示,我很樂意接受你的答案。 –