facebook官方维护着flux思想中的Dispatcher,他是flux单向数据流中dispatch的实现,下面简单分析一下dispatch的源码:

function Dispatcher() {
    this.$Dispatcher_callbacks = {}; // 使用register注册的方法会保存在这里
    this.$Dispatcher_isPending = {}; // 当使用dispatch分发action的时候,会使得$Dispatcher_callbacks中所有的之前注册的方法执行,这里是标记每一个方法的执行状态,如果执行中就是true,否则是false
    this.$Dispatcher_isHandled = {};
    this.$Dispatcher_isDispatching = false; // 标记是否正在dispatch
    this.$Dispatcher_pendingPayload = null; // 保存dispatch中的action
}
Dispatcher.prototype.dispatch=function(payload) {
    this.$Dispatcher_startDispatching(payload); // 保存payload一起重置状态
    for (var id in this.$Dispatcher_callbacks) { // 遍历$Dispatcher_callbacks
        if (this.$Dispatcher_isPending[id]) { // 如果该方法处于等待状态
          continue; // 跳过
        }
        this.$Dispatcher_invokeCallback(id); // 使用 $Dispatcher_invokeCallback执行方法
      }
};
Dispatcher.prototype.$Dispatcher_invokeCallback=function(id) {
    this.$Dispatcher_isPending[id] = true; // 标记该方法为执行状态
    this.$Dispatcher_callbacks[id](this.$Dispatcher_pendingPayload); // 执行该方法
    this.$Dispatcher_isHandled[id] = true;
  };
Dispatcher.prototype.$Dispatcher_startDispatching=function(payload) {
    for (var id in this.$Dispatcher_callbacks) {
      this.$Dispatcher_isPending[id] = false; // 重置等待状态
      this.$Dispatcher_isHandled[id] = false;
    }
    this.$Dispatcher_pendingPayload = payload; // 保存payload
    this.$Dispatcher_isDispatching = true;
  };
// waitfor的作用从这里看来是先执行指定的ids,然后再执行waitfor后面的代码,而不是等待ids函数执行完毕,再去执行waitfor后面的代码,我之所以这样说 是因为考虑到异步的存在
Dispatcher.prototype.waitFor=function(ids) { for (var ii = 0; ii < ids.length; ii++) { var id = ids[ii]; if (this.$Dispatcher_isPending[id]) { continue; } this.$Dispatcher_invokeCallback(id); } };
01-07 23:41