因此,我有一個可觀察的事件,它使HTTP帖子從服務器獲取訪問令牌。我有另一個執行到同一臺服務器,但需要從第一個訪問令牌存在。所以我希望能夠在兩個不同的地方同時訂閱兩個可觀察對象,但是GET可觀察對象當然必須等待POST可觀察對象。我如何在另一個Observable訂閱完成時觀察到等待?RxJS Observable等待Observable
0
A
回答
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的回調地獄,然後在準備就緒時下載到下一個觀察值。對於單個頁面,發佈請求是完全隱藏的,他們只是訂閱獲取請求。
請注意,此代碼可能會更清潔箭頭功能,但我試圖保持與一些舊瀏覽器兼容。
相關問題
- 1. Rxjs Observable Interval和Angular2 HTTP:等待響應
- 2. combine RxJs Observable array
- 3. Rxjs,Observable鏈接
- 4. RXJS Observable doSomething onComplete
- 5. rxjs switch unwrapping observable
- 6. 等待Observable訂閱完成
- 7. RxJs Observable <string> vs Observable <string[]>
- 8. Rxjava,如何設計必須等待另一個Observable的Observable
- 9. rxjs Observable .map沒有執行
- 10. 將RxJS Observable轉換爲Promise
- 11. 在firestore中使用rxjs Observable
- 12. Angular 2 RxJS Observable not loading
- 13. RxJS/Rx.Net Observable-subscribe vs async-await
- 14. 在Net 4.0中使用Microsoft.Bcl.Async等待Observable
- 15. F#反應等待Observable完成
- 16. Angular 4 Observable等待第一個響應
- 17. Angular2 HTTP Get Observable - 如何等待結果
- 18. 如何等待異步Observable來完成
- 19. 用Redux Observable等待動作序列
- 20. 等待另一個observable繼續之前
- 21. 如何在flatMap()中等待Observable的onComplete()
- 22. 我應該同時使用'import'rxjs/Rx'`和`import {Observable} from'@ rxjs/Observable'`
- 23. 如何使用Observable參數對Observable進行排序? rxjs
- 24. 立即取消訂閱rxjs observable
- 25. Angular 2 rxjs switchmap returns Observable <Object>
- 26. RxJS打字錯誤缺失Observable
- 27. Rxjs - 重新訂閱取消訂閱Observable
- 28. 從RxJS過濾器()謂詞返回Observable
- 29. Rxjs Observable發送undefined - 如何避免它
- 30. rxjs observable的訂閱數量限制
重要的是,它適合你。然而:1.如果你必須鏈接一系列可觀察的事件,那麼它不會是回調地獄,但它將會是地獄,2.這些機制(操作的順序)已經在Rx操作符中實現了,最好的是重用和組合現有的代碼,這是廣泛測試。 3.一般來說,最好是在功能上進行編程,即儘可能多地使用純函數(無副作用),這會簡化你的推理和測試(我在這裏理解'postObservable'以某種方式修改'authToken') – user3743222
你真的只是在做'this.postObservable.flatMap(function(authToken){return $ .ajax(...)})''。然後你可以訂閱它來處理來自ajax調用的數據。我會更新我的答案以反映新信息。我建議您閱讀本文以進一步瞭解Rxjs:https://gist.github.com/staltz/868e7e9bc2a7b8c1f754 – user3743222
@ user3743222有趣的。你認爲你可以更新你的答案來反映這個評論嗎?如果你可以用上面給出的變量來表示,我很樂意接受你的答案。 –