https://facebook.github.io/flux/docs/dispatcher.html#content

首先安装

npm install --save flux

Dispatcher

dispatcher 和 订阅发布模式(pub-sub systems)有两个不同点:

  1. 在有事件触发的时候,每个注册到dispatcher上的回调函数都会接收到,它们不是针对指定事件才回调
  2. 回调函数可以延迟执行,可以等到其他所有或部分回调函数执行后才执行

例子

演示第一个不同点:

const flux = require("flux")

var dispatcher = new flux.Dispatcher();

dispatcher.register(function (payload) {
console.log("1")
console.log(payload)
});
dispatcher.register(function (payload) {
console.log("2")
console.log(payload)
}); dispatcher.dispatch({
actionType: 'city-update',
selectedCity: 'paris'
});

运行结果:

1
{ actionType: 'city-update', selectedCity: 'paris' }
2
{ actionType: 'city-update', selectedCity: 'paris' }

可见注册的所有回调函数都按顺序执行了。所以一般要在回调函数中判断类型,再执行后续的操作

演示第二个不同点:先执行第二个回调函数再执行第一个。

const flux = require("flux")

var dispatcher = new flux.Dispatcher();

dispatcher.register(function (payload) {
dispatcher.waitFor([token]);
console.log("1")
console.log(payload)
});
var token = dispatcher.register(function (payload) {
console.log("2")
console.log(payload)
}); dispatcher.dispatch({
actionType: 'city-update',
selectedCity: 'paris'
});

执行结果:

2
{ actionType: 'city-update', selectedCity: 'paris' }
1
{ actionType: 'city-update', selectedCity: 'paris' }

dispatcher原理简单实现如下:

class Dispatcher {
constructor() {
this.cbs = {}
this.order = []; // for marking the register order
this.curPayload = null;
} register(callback) {
var token = Math.random()
this.cbs[token] = {
callback,
exected: false,
}
this.order.push(token);
return token
} waitFor(tokens) {
var self = this;
tokens.forEach((token) => {
var c = self.cbs[token]
c.exected || c.callback(self.curPayload)
c.exected = true;
})
} dispatch(payload) {
this.curPayload = payload
var self = this;
this.order.forEach((token) => {
var c = self.cbs[token]
c.exected || c.callback(payload)
})
// reset status
this.order.forEach((token) => {
var c = self.cbs[token]
c.exected = false;
})
}
}

Flux Utils

flux utils 提供了一些工具类来帮助我们实现一个简单的flux架构,但它们不具备flux架构的所有特征,不能帮我们实现所有的用户场景。

这个工具集主要暴露了 3 个类出来,分别是:Store、ReduceStore和Container

主要使用的是ReduceStore和Container

https://github.com/947133297/reactDemo/tree/master/simple-flux

Flux reference的更多相关文章

  1. 构建具有用户身份认证的 React + Flux 应用程序

    原文:Build a React + Flux App with User Authentication 译者:nzbin 译者的话:这是一篇内容详实的 React + Flux 教程,文章主要介绍了 ...

  2. Spring Boot Reference Guide

    Spring Boot Reference Guide Authors Phillip Webb, Dave Syer, Josh Long, Stéphane Nicoll, Rob Winch,  ...

  3. React: 研究Flux设计模式

    一.简介 一般来说,State管理在React中是一种最常用的实现机制,使用这种state管理系统基本可以开发各种需求的应用程序.然而,随着应用程序规模的不断扩张,原有的这种State管理系统就会暴露 ...

  4. ASP.NET Core: You must add a reference to assembly mscorlib, version=4.0.0.0

    ASP.NET Core 引用外部程序包的时候,有时会出现下面的错误: The type 'Object' is defined in an assembly that is not referenc ...

  5. Flux 普及读本

    话说当时做 APP 时,三月不知肉味,再次将眼光投放前端,有种天上一天,地下一年的感觉. Flux 是一种思想 了解的最好方式当然是看Flux官方文档了.React 中文站点也能找到对应的翻译版本,但 ...

  6. 【转】Django Model field reference学习总结

    Django Model field reference学习总结(一) 本文档包含所有字段选项(field options)的内部细节和Django已经提供的field types. Field 选项 ...

  7. (转) Qt 出现“undefined reference to `vtable for”原因总结

    由于Qt本身实现的机制所限,我们在使用Qt制作某些软件程序的时候,会遇到各种各样这样那样的问题,而且很多是很难,或者根本找不到原因的,即使解决了问题,如果有人问你为什么,你只能回答--不知道. 今天我 ...

  8. undefined reference to `__android_log_print'

    使用android studio 编写NDK代码时出现错误:undefined reference to `__android_log_print' 解决办法: eclipse       andro ...

  9. CentOS 6.5 编译 PHP-7 报错:undefined reference to `libiconv_open 无法编译 PHP libiconv

    ./configure --with-mysql=/backup/mysql --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zli ...

随机推荐

  1. MyBatis逆向工程中domainObjectRenamingRule报错或无效

    使用domainObjectRenamingRule报错 在使用MyBatis逆向工程时报错如下: org.mybatis.generator.exception.XMLParserException ...

  2. JSP | 基础 | Button跳转页面

    <input type = "button" value = "登陆" onclick = "window.location.href = 'L ...

  3. PostgreSQL-7-数据连接

    1.通过WHERE进行简单连接 SELECT * FROM company3,department  不添加WHERE将会显示所有数据 SELECT * FROM company3,departmen ...

  4. VLAN-1-VLAN配置

    f0/12和f0/24不在列表中,因为它们动态地成为trunk,支持多个vlan       “unsup”意为这个2950交换机不支持FDDI和TR       首先 switchport mode ...

  5. 简单的Javascript图片延迟加载库Echo.js

    简介: 和 Lazy Load 一样,Echo.js 也是一个用于图像延迟加载 JavaScript.不同的是 Lazy Load 是基于 jQuery 的插件,而 Echo.js 不依赖于 jQue ...

  6. celery (分布式系统)

    celery 介绍 Celery - 分布式任务队列. Celery 是一个简单.灵活且可靠的,处理大量消息的分布式系统,并且提供维护这样一个系统的必需工具. ​ 它是一个专注于实时处理的任务队列,同 ...

  7. [coci2015-2016 coii] dijamant【图论】

    传送门:http://www.hsin.hr/coci/archive/2015_2016/ 进去之后的最下面的国家赛.顺便说一句,dijamant是克罗地亚语的“钻石”的意思. 官方题解是说压位的暴 ...

  8. 洛谷1941(dp)

    常规的dp,当前有值且碰不到管子就转移,可以连跳的操作我就加了一维表示当前是不是连跳过来的.第二问前缀和即可得(不对啊边走边记录就行了吧我冗了Orz). #include <cstdio> ...

  9. YII报错笔记:<pre>PHP Notice &#039;yii\base\ErrorException&#039; with message &#039;Uninitialized string offset: 0&#039; in /my/test/project/iot/vendor/yiisoft/yii2/base/Model.php:778

    YII常见报错笔记 报错返回的代码如下: <pre>PHP Notice 'yii\base\ErrorException' with message 'Uninitialized str ...

  10. 迅为4412开发板Linux设备树的镜像烧写和源码简单优化教程

    1 烧写:   烧写和4412默认镜像的烧写类似,使用fastboot. 先更新uboot,用4412默认uboot更新支持设备树的uboot 用支持设备树的uboot烧写. 进入支持设备树的uboo ...