2017-06-02 69 views
1

我正在使用combineLatest可观察两个流和选择器函数。RxJS运行选择器功能只有一次

const todos = Rx.Observable.of([{ 
 
    id: 1, 
 
    completed: false, 
 
    text: 'one' 
 
}, { 
 
    id: 1, 
 
    completed: true, 
 
    text: 'two' 
 
}]); 
 

 
const filter = Rx.Observable.of('SHOW_ALL'); 
 

 

 
const getTodos = Rx.Observable.combineLatest(todos, filter, (todos, filter) => { 
 
    console.log('calculation'); 
 
    // doing some calculation... 
 
    return todos; 
 
}); 
 

 
getTodos.subscribe(console.log) 
 
getTodos.subscribe(console.log)
<script src="https://unpkg.com/@reactivex/[email protected]/dist/global/Rx.js"></script>

我需要的结果选择只运行一次同时为用户避免重新计算。例如,如果缓存结果并给我最新的值,如果两个输入都没有改变。

有没有办法用RxJS来做到这一点?

+0

请看看'share'和'publish'运营商:他们专为这种情况。 – dzejdzej

+0

我试过共享运算符,它不适合我。 – undefined

+0

@undefined我不工作怎么样?你能证明你的尝试吗? – martin

回答

2

我认为您正在寻找shareReplay运营商。它允许您在所有用户之间共享您的combineLatest产生的价值。 https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/sharereplay.md

你可能想看看replay,如果你不想自动连接/断开当用户去从0到1或更多,反之亦然。 https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/replay.md

const getTodos = Rx.Observable.combineLatest(todos, filter, (todos, filter) => { 
    console.log('calculation'); 
    // doing some calculation... 
    return todos; 
}) 
.shareReplay(); 

这里是一个正在运行的例子:

const todos = Rx.Observable.of([{ 
 
    id: 1, 
 
    completed: false, 
 
    text: 'one' 
 
}, { 
 
    id: 1, 
 
    completed: true, 
 
    text: 'two' 
 
}]); 
 

 
const filter = Rx.Observable.of('SHOW_ALL'); 
 

 
const getTodos = Rx.Observable.combineLatest(todos, filter, (todos, filter) => { 
 
    console.log('calculation'); 
 
    // doing some calculation... 
 
    return todos; 
 
}) 
 
.shareReplay(); 
 

 
getTodos.subscribe(console.log.bind(console)) 
 
getTodos.subscribe(console.log.bind(console))
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.1.0/rx.lite.js"></script>

+0

我收到此错误:Rx.Observable.combineLatest(...)。shareReplay不是函数 – undefined

+0

'shareReplay'自RxJS 5.4.0起可用。你很可能有更老的版本。 – martin

+1

哦真的!不,它也可以在RxJS4中使用(我链接的文档来自v4文档) – atomrc