2016-03-31 16 views
1

koymak olsun şu:rxjs: akışları sıfırlanır ve sadece bir çıkış ben gibi bir şey bir combineLatest bir araya gelip iki ayrı akışları var

const programState$ = Rx.Observable.combineLatest(
    high$, low$, 
    (high, low) => { 
     return program(high, low); 
    }); 

Bu ince ve züppe çalışıyor ama aynı zamanda mümkün istiyorum Hem yüksek $ hem de düşük $ değerini başlangıç ​​durumuna getirmek ve sadece programı bir kez ateşlemek. Aşağıdaki gibi bir tür:

Her ikisi de, Event'ten başlatılan bir initialData akışından geliyor. Program normal çalıştığı sırada birleşikLatest harika çalışıyor. FirstData fromEvent başlatıldığında aynı sonucu nasıl elde edebilirim? Şu anda program iki kez çalışır.

+0

sen açıklamak neresi 'initialDataBranch' ve 'Etkileşimli' akışları nelerdir? Neyin işe yarayıp neyin işe yaramadığı belli değil. Programınız tam olarak ne zaman başarısız olursa veya beklenmedik davranışlarda bulunur ve bu davranış nedir? –

+0

@CalvinBelden her ikisi de initialDataBranch bir ve iki her ikisi de fromEvent öğesinden işlenen initialData akışından gelir. Program, CombineLatest'ten beklendiği gibi davranır ancak istenen şekilde değil. – jamesRH

cevap

2

Aynı nesnede high ve low özelliklerini saklayabiliriz. çeşitli etkinlikler bu durumu güncellemek için gelip Daha sonra bir scan gerçekleştirebilir:

// Define your default high/low values 
const defaultHighLow = /** **/; 

// Different types of updates/actions 
const highUpdate$ = high$.map(high => ({ high, type: 'UPDATE HIGH' })); 
const lowUpdate$ = low$.map(low => ({ low, type: 'UPDATE LOW' })); 
const resetUpdate$ = reset$.map(high => ({ type: 'RESET' })); 

// Merge all the different types of actions to single stream 
const update$ = Rx.Observable.merge(highUpdate$, lowUpdate$, resetUpdate$); 

// Scan over these updates to modify the high/low values 
const highLowState$ = update$.scan((state, update) => { 
    if (update.type === 'UPDATE HIGH') { 
    return { ...state, high: update.high }; 
    } 

    if (update.type === 'UPDATE LOW') { 
    return { ...state, low: update.low }; 
    } 

    // Return defaultHighLow if reset update is triggered 
    if (update.type === 'RESET') { 
    return defaultHighLow; 
    } 

    // Return state by default 
    return state; 
}, defaultHighLow).startWith(defaultHighLow); 

Ve sonunda daha önce olduğu gibi programın durumunu türetebilirsiniz:

const programState$ = highLowState$.map(hl => program(hl.high, hl.low)); 
+0

Size biraz daha iyi anlatayım, bu yüzden defaultHighLow durumu ve resetUpdate, highUpdate, lowUpdate, sadece defaultHighLow değerlerini tarama yoluyla güncelleyecek mi? – jamesRH

+0

'defaultHighLow', uygulamanızın" high "ve" low "için varsayılan değerlerini içerecektir. Sıfırlama güncellemesi olduğunda, bu varsayılan değerleri döndürürüz. Aksi takdirde, "high" değerini veya "low" değerini güncelleriz. bu mantıklı mı? –

+0

Bu işe yarıyor! Yardım ettiğin için teşekkür ederim – jamesRH

İlgili konular