2017-09-04 26 views
0

觀察到等於待定的HTTP請求在我的項目,有時因爲錯誤,我做還是一個較新的團隊成員做,有些時候有一些特定參數的HTTP請求被髮送到遠程後端不止一次(這意味着在開發工具中的瀏覽器http請求會出現兩次未完成的請求)。如何重用角4

這種情況下對我們有害,並在遙控是在回答該比是把他們的時間間隔更慢的速度此要求的情況下才給我們造成的問題。

這裏顯而易見的解決辦法是始終確保我們發送同一類型(而params)的下一個請求之前得到一些類型的requst的答案。但我認爲應該有一種方法來確保以一種通用的方式,如果某個請求即將與角度http服務一起發送,如果該請求已經存在且處於掛起狀態,那麼該服務可以返回SAME可觀察對象由之前已經掛起的請求返回(這將解決一些凌亂的情況,當我有兩個不同和不相關的組件一個接一個地發出相同的請求時,這將使它們都訂閱相同的可觀察對象)。

我們已經有一項服務,它包含了我們在我們項目中使用http的所有用途。

的問題是我怎麼能實現這種行爲(或者如果由於某種原因,我的想法是錯誤的,也許我不應該致力於獲得這樣的行爲嗎?),我正在尋找可用的最簡單的解決方案(也許已經有通過角implmented東西來實現這一點,我錯過了嗎?),或者如果沒有某種形式的基於obserable溶液中,對於每一個要求,我們即將做出是否請求已經與掛起狀態

存在
+0

請格式化使用段落這個問題,等 –

+0

它是可以理解的呢? –

+0

您可能會發現這個有趣的:https://hackernoon.com/angular-simple-in-memory-cache-service-on-the-ui-with-rxjs-77f167387e39 – cartant

回答

0
檢驗

我想建議switchMap,但distinctUntilChanged將在這個特定情況下有所幫助,因爲我們想在參數不同時提出請求。我假設這些論點來自另一個可觀察的事物。

Rx.Observable 
    .interval(300) // every 300ms 
    .mapTo(Math.floor(Math.random() * 10) // emit a number from 0 to 9 
    .distinctUntilChanged() // if number is the same, ignore it 
    .flatMap(number => this.exampleService.makeRequest(number)) // make a request for a unique number 
    .subscribe(response => console.log(response)); // log response 
+0

我不能理解這個cade的例子是如何回答這個問題的 –

0

的問題可以在多個訂閱:

var res = this.myService.get(); 
var firstSubscription = res.subscribe(); // first http call 
var firstSubscription = res.subscribe(); // second 

嘗試使用多播運營商:

var resShared = this.myService.get().share(); 
+0

從我的理解這個解決方案只適用於我的代碼的2部分使用與http調用相同的觀察值。如果2個不相關的組件進行相同的http調用,這將無濟於事,因爲它們會得到2個不同的可觀察對象,因爲這是缺省的http服務行爲,所以這個答案根本不能解決問題 –

+0

[您可以使用memoization(緩存)]( http://jsbin.com/mosuyoyohe/edit?js,console) – Tidjei