reflux
是一個flux的實現框架,但又在部分概念和實現上與flux的產生了分歧。分歧點主要是爲了:javascript
一個重要的分歧點是reflux
中取消了flux
中的waitFor
的概念,取而代之的是:java
store
之間能夠相互監聽。當一個Store完成數據獲取後,trigger出來的數據會傳遞到另外一個store,產生連鎖反應。store
監聽的actions能夠聚合,這是在flux中沒有的。如下着重談談事件的聚合。docker
reflux
主要提供了四個函數:框架
上次的說法仍是挺抽象的,具體到例子:函數
javascriptvar reflux = require('reflux'); var actions = reflux.createActions([ 'hello', 'greet', 'say' ]); var store = reflux.createStore({ init: function () { this.joinTrailing(actions.hello, actions.greet, actions.say, this.trigger); } }); store.listen(function() { console.log('triggering with', arguments); }); actions.hello('bubu'); actions.greet('chacha'); actions.say('dockers'); actions.hello(1,2,3); actions.greet('miku'); actions.say('dockers'); 結果: triggering with { '0': [ 'bubu' ], '1': [ 'chacha' ], '2': [ 'dockers' ] } triggering with { '0': [ 1, 2, 3 ], '1': [ 'miku' ], '2': [ 'dockers' ] }
上面例子表示,store
監聽一系列action的集合,只有每一個Action都觸發了,纔會最後觸發store
上註冊的回調函數。ui
而joinTrailing
的意義在何處呢?若是把上面的action
觸發順序換成下面:this
actions.hello('bubu'); actions.hello(1,2,3); actions.greet('chacha'); actions.say('dockers'); actions.greet('miku'); actions.say('dockers'); 結果: triggering with { '0': [ 1, 2, 3 ], '1': [ 'chacha' ], '2': [ 'dockers' ] }
會發現bubu
已經被無視了,且因爲剩下的greet
和say
沒法完整地構成事件組合,故沒有觸發回調。編碼
對於joinConcat
可得:code
javascriptactions.hello('bubu'); actions.hello(1,2,3); actions.greet('chacha'); actions.say('dockers'); actions.greet('miku'); actions.say('dockers'); 結果: triggering with { '0': [ [ 'bubu' ], [ 1, 2, 3 ] ], '1': [ [ 'chacha' ] ], '2': [ [ 'dockers' ] ] }
joinLeading
和joinStrict
就不舉例了。flux