2017-02-02 49 views
3

如果多個訂戶等待相同的承諾,以便在給定新分辨率的情況下已經與後來的客戶進行交涉,那麼該如何處理?RxJs - 多個訂戶等待相同的承諾結果

doSomething =() => { 
    return new Promise((resolve) => { 
    setTimeout(() => resolve(Math.random(), 1000) 
    }) 
} 

// how to define obs? 

obs.subscribe(v => console.log(v)); // 0.39458743297857473 
obs.subscribe(v => console.log(v)); // 0.39458743297857473 
obs.subscribe(v => console.log(v)); // 0.39458743297857473 

setTimeout(() => obs.subscribe(v => console.log(v)), 2000); // 0.9485769395265746 

我想可觀察到的仍然寒冷,直到第一個用戶,然後再冷的結果傳輸到所有後續併發用戶後再次。我基本上不希望對同一個底層函數發出任何併發請求。

回答

3

您可以使用defer爲創造運營商,然後share流:

doSomething =() => { 
    return new Promise((resolve) => { 
    setTimeout(() => resolve(Math.random(), 1000)); 
    }); 
} 

const obs = Rx.Observable 
    .defer(doSomething) 
    .share(); 

obs.subscribe(console.log); // resolve #1 
obs.subscribe(console.log); // resolve #1 
obs.subscribe(console.log); // resolve #1 

setTimeout(() => obs.subscribe(console.log), 2000); // resolve #2 
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script> 
+2

尼斯回答,雖然一些鏈接的文檔將是很好! –

+1

好點,我添加了一些鏈接到文檔。 – olsn

+0

這適用於我給的例子,所以我接受了。非常感謝您的幫助。我實際上早先嚐試過,它不適合我的實際使用情況,而不是我爲簡化事情而給出的例子。我現在看到它爲什麼不起作用,它不是可重入的。在使用obs的管道的末尾,有一個庫代碼在訂閱,並且在onNext塊中,它正在生成一個動作,.... drumroll ...依賴於obs,因此死鎖。我不知道我總是以這些血腥的可怕邊緣事件結束! :-) – mysomic