Cordova 3.x 源码分析(4) -- cordova.js事件通道pub/sub

阅读更多
作为观察者模式(Observer)的一种变形,很多MV*框架(比如:Dojo、Backbone.js)中都提供发布/订阅模型来对代码进行解耦。cordova.js中也提供了一个自定义的pub-sub模型,基于该模型提供了一些事件通道,用来控制通道中的事件什么时候以什么样的顺序被调用,以及各个事件通道的调用。

src/common/channel.js的代码结构也是一个很经典的定义结构(构造函数、实例、修改函数原型共享实例方法),它提供事件通道上事件的订阅(subscribe)、撤消订阅(unsubscribe)、调用(fire)。最后发布了8个事件通道。

源码如下:
// file: src/common/channel.js
define("cordova/channel", function(require, exports, module) {

var utils = require('cordova/utils'),
    nextGuid = 1;

// ①事件通道的构造函数
var Channel = function(type, sticky) {
    // 通道名称
    this.type = type;
    // 通道上的所有事件处理函数Map(索引为guid)
    this.handlers = {};
    // 通道的状态(0:非sticky, 1:sticky但未调用, 2:sticky已调用)
    this.state = sticky ? 1 : 0;
    // 对于sticky事件通道备份传给fire()的参数
    this.fireArgs = null;
    // 当前通道上的事件处理函数的个数
    this.numHandlers = 0;
    // 订阅第一个事件或者取消订阅最后一个事件时调用自定义的处理
    this.onHasSubscribersChange = null;
},

// ②事件通道外部接口
    channel = {

        // 把指定的函数h订阅到c的各个通道上,保证h在每个通道的最后被执行
        join: function(h, c) {
            var len = c.length,
                i = len,
                f = function() {
                    if (!(--i)) h();
                };
            // 把事件处理函数h订阅到c的各个事件通道上
            for (var j=0; j 
 

参考:
http://stackoverflow.com/questions/13512949/why-would-one-use-the-publish-subscribe-pattern-in-js-jquery

你可能感兴趣的:(Cordova,PhoneGap)