reflux
是一个flux的实现框架,但又在部分概念和实现上与flux的产生了分歧。分歧点主要是为了:
- 简化Flux的编码量,让机器完成那些重复的体力活。
- 迈向Reactive Programming,而不是Imperative Programming.
一个重要的分歧点是reflux
中取消了flux
中的waitFor
的概念,取而代之的是:
-
store
之间可以相互监听。当一个Store完成数据获取后,trigger出来的数据会传递到另一个store,产生连锁反应。 -
store
监听的actions可以聚合,这是在flux中没有的。
以下着重谈谈事件的聚合。
reflux
主要提供了四个函数:
- joinLeading: 只响应第一次emit出来的,在完成一次trigger前,剩下的emission不管了。
- joinTrailing: 在一次trigger前,无视最后一次emission出来的数据。
- joinConcat: 在一次trigger前,保存所有emission的数据。
- joinStrict: 如果在一次trigger之前多次emit,抛异常。
上次的说法还是挺抽象的,具体到例子:
javascript
var 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
上注册的回调函数。
而joinTrailing
的意义在何处呢?如果把上面的action
触发顺序换成下面:
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
可得:
javascript
actions.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
就不举例了。