最高性能的观察者模式
特点:
1、性能经测试确实高出目前市面上的所有类似的系统
2、而且代码相当精简。请看我对arbiter的源码分析
3、功能强大,虽然代码精简,但功确非常强大,请看下面的API介绍
================================================================================
官方网址:http://arbiterjs.com
性能测试地址
http://jsperf.com/pubsubjs-vs-jquery-custom-events/66
================================================================================
Arbiter.js 是一个轻量及的 javascript 发布订阅设计模式 (pub/sub pattern)实现;它允许页面中对象之间通信的解耦。这将会使程序系统更干净,简单易读,更易维护
举个栗子:如果用户在页面中某个位置改变了某个值,它将发布这条消息告知哪部分发生了变化。页面中另一部分能订阅这条消息,并在接受到此消息时执行相应的逻辑,彼此并不需要关心对方,它只是宣布某件事情发生了并发出此消息,谁订阅了,谁就会收到此消息
栗子:
// In the "notifications" widget, I want to do something when new mail arrives Arbiter.subscribe("email/new", function(data) { document.getElementById('notification').innerHTML = "New email from "+data.from; }); // This code is called by the system that detects incoming email Arbiter.publish("email/new", {from:"Bob"});
Method Summary 主要方法:
Arbiter.publish 发布
Arbiter.publish( msg [, data [, options] ] ) Returns: true on success, false if any subscriber has thrown a js exception Success时返回true, 某个订阅者中发生错误时抛出false
Arbiter.subscribe 订阅
Arbiter.subscribe( msg, func ) Arbiter.subscribe( msg, options, func ) Arbiter.subscribe( msg, options, context, func ) Returns: subscription id or [id1,id2] if subscribing to multiple messages 返回订阅者对象的id或id数组
Arbiter.unsubscribe 取消订阅
Arbiter.unsubscribe( subscription_id )
Arbiter.resubscribe 恢复订阅
Arbiter.resubscribe( subscription_id )
====================How To 如何使用=========================
Publish a simple message
发布一个简单的消息
Arbiter.publish( 'component/msg' );
消息的可以以任何格式,但不能包含“,”或“*”号,推荐这样的惯例“a/b/c”,来允许消息类型的分类
Subscribe to a message 订阅消息
Arbiter.subscribe( 'component/msg', function() { } );
订阅消息参数如下:
· published_data: 发布的所有消息
· message: 消息的类型,(对于同时侦听多种消息类型非常有用)
· subscriber_data: 订阅者的参数。也许对于想将上下文传递给下个订阅者非常有用,默认为空对象
This指针指向的是订阅者自身
Pass data to subscribers 传递数据给订阅者
Arbiter.publish( 'component/msg', {"data":"value"} );
发布者可以传递数据给订阅者,数据包含了具体的消息内容
Force message bubbling 允许消息冒泡
Arbiter.publish( 'component/msg' , null, {cancelable:false} );
默认订阅都可以返回false来阻止下一个订阅者接受消息,参数中设置cancelable:false,可以取消订阅者的阻止功能
Allow late susbcribers to be notified of past messages 允许后来订阅者订阅消息
Arbiter.publish( 'component/msg' , null, {persist:true} );
默认,订阅者只能接受到订阅之后发布者发出的消息,但是一些事件,比如系统初始化信息("system initalized")只会发出一次,如果需要在消息发布后才订阅的订阅者也能执行相应的逻辑,则传递persist属性来达到,之后订阅也能收到以前已发出过的消息;
Fire subscribers asynchronously 异步执行订阅者回调
Arbiter.publish( 'component/msg', null, {async:true} );
默认情况下,订阅者的回调都是同步方式来执行代码(javascript的执行是单线程的),所以publish() 方法不会等到执行完所有订阅者的回调才返回, 如果你希望异步执行来防止阻塞,则使用此方法;
注意:异步执行的回调,无法阻止冒泡,因为异步的实现是用setTimeout方法模拟
Subscribe to multiple messages at once 一次订阅多个消息类型
Arbiter.subscribe( 'component/msg, component/msg2', function() { } ); or Arbiter.subscribe( ['component/msg','component/msg2'], function() { } );
订阅者回调中第二个参数是消息类型,可以用于区分当前接受到的是哪条消息
Subscribe to multiple messages using a wildcard 通过通配符同时订阅多条消息
Arbiter.subscribe( 'component/*', function() { } );
这对于订阅某一类型的消息非常有用
Subscribe to ALL messages 订阅所有消息
Arbiter.subscribe( '*', function() { } );
Set subscriber priority 设置订阅者的权重
Arbiter.subscribe( 'msg', {priority:10}, func(){} );
Arbiter.subscribe( 'msg', {priority:20}, func(){} ); // Called first!
默认,所有的订阅者权重值为0,越高的权重值,越先被执行,也允许传递负值
Execute a subscriber asynchronously 异步执行订阅者回调
Arbiter.subscribe( 'msg', {async:true}, func(){} );
订阅者也可以自己设置指定自己的回调异步执行,如果担心自己的回调会非常耗时。
Ignore persisted messages 忽略持久消息
Arbiter.subscribe( 'msg', {persist:false}, func(){} );
如果订阅者不关心已发布过的消息,则可以传递{persist:false}
Set the value of "this" 设置this
Arbiter.subscribe( 'msg', null, document.getElementById('x'), function() { this.innerHTML = "Message handled!"; } );
可以为回调指定执行上下文
Unsubscribe from messages 取消订阅
var subscription_id = Arbiter.subscribe( 'msg', function(){} ); Arbiter.unsubscribe( subscription_id );
取消订阅执行后会返回此回调的ID,用于将来恢复订阅
Re-subscribe to messages 恢复消息回调
var subscription_id = Arbiter.subscribe( 'msg', function(){} );
Arbiter.unsubscribe( subscription_id ); Arbiter.resubscribe( subscription_id );
取消订阅后可以通过此方法恢复订阅
Create a new message handler 创建新的发布订阅系统
var MyController = Arbiter.create()
创建单独的互不引响的发布订阅系统
================================================================================
由于是老外写的东西,好像没有中文版的API,所以自己翻译了一下,其实说不上翻译,只是用中文表达出了API的使用方法。有不正确的地方,请以官方英文版为准
注:转载请注明出处:偷饭猫email: xiaodong1986@me.com