promiseEvent Class
基于事件和promise的回调管理,类似于jquery的callbacks,但具有结果传递,优先级,事件参数,promise控制等功能; 默认注册的事件都是按照优先级,依次执行,无论同步还是异步;但在非阻塞模式下,则事件不会等待上一个执行完毕(异步), 直接回依次执行,只是在最后的结果中会等待所有的事件执行完毕之后才返回
Defined in:
Module: AOP
src\base\aop.js:67
Constructor
promiseEvent
promiseEvent
(
-
[mode]
)
Parameters:
name | type | flag | description |
---|---|---|---|
[mode] |
String | optional | promiseEvent的模式,可以混用;
|
Example:
//标准模式
var events = st.promiseEvent(),
result = [];
//注册事件
events.add('call1', function(e, text) {
result.push('call1');
});
//自定义priority注册事件
events.add('call2', function(e, text) {
result.push('call2');
},100);
//单once模式注册
events.add('call3', function(e, text) {
result.push('call3');
},'once');
//所有设置
events.add('call4', function(e, text) {
result.push('call4');
},50,'once');
//返回promise
events.add("promiseCall", function(e, text) {
//异步的方法
setTimeout(function() {
result.push('promiseCall');
e.resolve();
},0);
return e.promise();
},20);
//回调中如果存在promise需要,st.when来获取结果
st.when(events.fire('test')).done(function(){
expect(result.join('-')).toBe('call2-call4-promiseCall-call1-call3');
});
//已once模式创建事件管理
var onceCalls = st.promiseEvent("once"),
result = [];
onceCalls.add("c1", function {
result.push("c1");
});
//执行之后即销毁
onceCalls.fire
expect(onceCalls.has('c1')).toBe(false);
var result = [],obj2 = st.attachTrigger({
test: function(name) {
result.push(name);
}
}, "callback");
obj2.onBefore("test", "addBefore", function(name) {
result.push('before-' + name);
}).on("test", "addAfter", function(name) {
result.push('after-' + name)
});
obj2.test('bind');
expect(result.join(',')).toBe("before-bind,bind,after-bind");
var pCalls = st.promiseEvent(),
result = [];
pCalls.add("c1", function(e, name) {
//延迟100ms
setTimeout(function() {
//完成promise,并返回结果
e.resolve(name + ',resolve!');
}, 100);
//返回promise
return e.promise();
});
//使用when来监控promiseEvent的执行,使用done来处理执行完毕的方法
$.when(pCalls.fire("call")).done(function(data) {
expect(data).toBe('call,resolve!');
});
//创建一个noBlock模式的promiseEvents;
var noBlockCalls = st.promiseEvent("noBlock"),
result = [];
//第一个回调延迟100
noBlockCalls.add("c1", function(e) {
setTimeout(function() {
result.push('c1');
e.resolve();
}, 100);
return e.promise();
});
//第二个正常执行
noBlockCalls.add("c2", function(e) {
result.push('c2');
});
//第三个回调延迟50
noBlockCalls.add("c3", function(e) {
setTimeout(function() {
result.push('c3');
e.resolve();
}, 50);
return e.promise();
});
$.when(noBlockCalls.fire()).done(function(data) {
//最终执行顺序是c2-c3-c1
expect(result + '').toBe('c2,c3,c1');
});
var resultCalls = st.promiseEvent
resultCalls.add("c1", function(e) {
return "c1";
}).add("c2", function(e) {
return e.result + ",c2";
});
expect(resultCalls.fire).toBe('c1,c2');
Methods
add
add
(
-
name
-
fn
-
[priority=0]
-
[mode]
)
chainable
添加事件回调方法
Parameters:
name | type | flag | description |
---|---|---|---|
name
| String | 事件回调名 | |
fn
| String | 事件回调方法 | |
[priority=0] |
Number | optional | 权重;预设为0,可以通过配置调整 |
[mode] |
String | optional | 回调模式:"once":执行一次 |
Example:
//标准模式
var events = st.promiseEvent(),
result = [];
//注册事件
events.add('call1', function(e, text) {
result.push('call1');
});
//自定义priority注册事件
events.add('call2', function(e, text) {
result.push('call2');
},100);
//单once模式注册
events.add('call3', function(e, text) {
result.push('call3');
},'once');
//所有设置
events.add('call4', function(e, text) {
result.push('call4');
},50,'once');
//返回promise
events.add("promiseCall", function(e, text) {
//异步的方法
setTimeout(function() {
result.push('promiseCall');
e.resolve();
},0);
return e.promise();
},20);
//回调中如果存在promise需要,st.when来获取结果
st.when(events.fire('test')).done(function(){
expect(result.join('-')).toBe('call2-call4-promiseCall-call1-call3');
});
clear
clear
()
chainable
清空所有事件回调
Example:
var events = st.promiseEvent
//添加回调
events.add('call1', function(e, text) {});
events.add('call2', function(e, text) {});
//回调事件总数为2
expect(events.len).toBe(2);
//清除events下面注册的事件
events.clear();
//回调事件总数为0
expect(events.len()).toBe(0);
fire
fire
(
-
args
-
[argHandle]
)
Object
执行回调
Parameters:
name | type | flag | description |
---|---|---|---|
args
| Array | 执行参数 | |
[argHandle] |
Function | optional | 参数处理方法,可以对eventarg进行修改;例如:argHandle(e) |
Returns:
[Object]
返回执行结果
fireWith
fireWith
(
-
context
-
args
-
[argHandle]
)
Object | Promise
根据上下文对象执行回调;fire方法的增强
Parameters:
name | type | flag | description |
---|---|---|---|
context
| Object | 上下文对象 | |
args
| Array | 执行参数 | |
[argHandle] |
Function | optional | 参数处理方法,可以对eventarg进行修改;例如:argHandle(e) |
Returns:
[Object | Promise]
返回执行结果
Example:
var events = st.promiseEvent,
target = {
name: 'target'
};
//注册事件
events.add('call1', function(e, text) {
return this.name + '-' + text + '-' + e.extend
});
//使用fireWith执行
var result = events.fireWith(target, ['test'], function(e) {
//扩展事件参数;只会在这一次的fire中生效
e.extend = function() {
return 'extend';
}
})
expect(result).toBe('target-test-extend');
has
has
(
-
name
)
Boolean
判断是否存在事件回调
Parameters:
name | type | flag | description |
---|---|---|---|
name
| String | 事件回调名 |
Returns:
[Boolean]
是否存在
Example:
var calls = st.promiseEvent
calls.add("call1", function(e) {});
//判断是否注册了"call1"的event
expect(calls.has("call1")).toBeTruthy;
len
len
()
Number
获取注册的事件长度/数
Returns:
[Number]
注册的事件长度/数
remove
remove
(
-
name
)
chainable
删除事件回调方法
Parameters:
name | type | flag | description |
---|---|---|---|
name
| String | 事件回调名 |
Example:
var events = st.promiseEvent
//注册事件
events.add('call1', function(e, text) {});
//删除事件
events.remove('call1');
expect(events.len).toBe(0);