2017-02-02 58 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