2017-06-02 86 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