smartjs 0.2发布 - 新增oop模块&AOP增强
2014-06-14 16:52
302 查看
SmartJS2.0发布,更新内容如下:
新增oop(klass,factory)模块;
promiseEvent加入非阻塞模式noBlock;
trigger加入属性监听;
smartjs主模块优化,支持requirejs和seajs;
单元测试页面优化;
先介绍一下针对AOP的优化部分:
在正常情况下执行fire方法会根据优先级依次去执行各个回调。但在回调中存在多个promise,那么整个PromiseEvent执行的效率就会很低;
举个例子:
有三个回调事件event1,event2,event3. 每个都是异步而且需要1s才能执行完毕。那么使用正常的promise来处理,整个执行就需要3s+;
如果三个回调是有关联关系的话,这样则是必须的。但如果是彼此没关系,那么等待所需的时间就没必要。
那么使用noBlock模式,每个回调在返回promise的时候,就会执行下一个,而不需要等到resolve时。那么执行上述三个回调的时间则只需1s+;
单个回调事件noBlock模式
属性监听只有before,after两种方法注入类型,不支持round环绕模式。
before:主要使用在做值变化的控制,比如是否需要更新,或者改变更新的值等等。
after:在after则是无法干预值的变化,因此只是做监听使用;
阻止更新方法
更新值变更和值传递例子
aop的更新内容介绍到这,下一篇介绍oop
SmartJS的GitHub地址
新增oop(klass,factory)模块;
promiseEvent加入非阻塞模式noBlock;
trigger加入属性监听;
smartjs主模块优化,支持requirejs和seajs;
单元测试页面优化;
先介绍一下针对AOP的优化部分:
PromiseEvent - noBlock 非阻塞回调模式
在前面0.1版中介绍了PromiseEvent这个对象,类似于JQuery的Callbacks,但是加入了Promise,Event参数管理,优先级控制等功能。在正常情况下执行fire方法会根据优先级依次去执行各个回调。但在回调中存在多个promise,那么整个PromiseEvent执行的效率就会很低;
举个例子:
有三个回调事件event1,event2,event3. 每个都是异步而且需要1s才能执行完毕。那么使用正常的promise来处理,整个执行就需要3s+;
如果三个回调是有关联关系的话,这样则是必须的。但如果是彼此没关系,那么等待所需的时间就没必要。
那么使用noBlock模式,每个回调在返回promise的时候,就会执行下一个,而不需要等到resolve时。那么执行上述三个回调的时间则只需1s+;
代码示例
整体noBlock模式//创建一个noBlock模式的promiseEvents; var noBlockCalls = st.promiseEvent("noBlock"); //第一个回调延迟100 noBlockCalls.add("c1", function(d) { setTimeout(function() { result.push('c1'); d.resolve(); }, 100); return d.promise(); }); //第二个正常执行 noBlockCalls.add("c2", function(d) { result.push('c2'); }); //第三个回调延迟50 noBlockCalls.add("c3", function(d) { setTimeout(function() { result.push('c3'); d.resolve(); }, 50); return d.promise(); }); $.when(noBlockCalls.fire()).done(function(data) { //最终执行顺序是c2-c3-c1 expect(result + '').toBe('c2,c3,c1'); testCall(); });
单个回调事件noBlock模式
var noBlockCalls2 = st.promiseEvent(); //第一个回调延迟100 noBlockCalls2.add("c1", function(d) { setTimeout(function() { result.push('c1'); d.resolve(); }, 100); //在返回promise的时候,指定noBlock模式 return d.promise("noBlock"); }); //第二个正常执行 noBlockCalls2.add("c2", function(d) { result.push('c2'); }); //第三个回调延迟100 noBlockCalls2.add("c3", function(d) { setTimeout(function() { result.push('c3'); d.resolve(); }, 100); return d.promise(); }); $.when(noBlockCalls2.fire()).done(function(data) { //最终执行顺序是c2-c1-c3 expect(result + '').toBe('c2,c1,c3'); testCall(); }); })
Trigger的属性监听(需IE9+支持)
0.1中的trigger只支持方法的注入。0.2版中加入了对于属性的监听功能。属性监听只有before,after两种方法注入类型,不支持round环绕模式。
before:主要使用在做值变化的控制,比如是否需要更新,或者改变更新的值等等。
after:在after则是无法干预值的变化,因此只是做监听使用;
代码示例
基础使用var obj = st.attachTrigger({ test: 1 }); //回调方法中有三个参数,事件参数e;更新的值value;原来的值oldValue obj.onBefore('test', 'testBefore', function(e, value,oldValue) { result.push(value + '-before-' + oldValue); }) obj.on('test', 'testAfter', function(e, value,oldValue) { result.push(value + '-after-' + oldValue); }) expect(obj.test).toBe(1); obj.test = 2; //输出前后置监听 expect(result.join(',')).toBe('2-before-1,2-after-1'); expect(obj.test).toBe(2);
阻止更新方法
var obj = st.attachTrigger({ test: 1 }); obj.onBefore('test', 'testBefore', function(d, value) { result.push(value + '-before'); //停止方法,阻止赋值行为 d.stop(); }) obj.on('test', 'testAfter', function(d, value) { result.push(value + '-after'); }) obj.test = 2; //最终更新失败,输出前置的监听内容 expect(result.join(',')).toBe('2-before'); expect(obj.test).toBe(1);
更新值变更和值传递例子
var obj = st.attachTrigger({ test: 1 }); //改变传递值只有在前置中有效 obj.onBefore('test', 'testBefore', function(d, value,oldValue) { result.push('before:[' + value + ',' + oldValue + ',' + d.result +']'); return ++value; }) obj.onBefore('test', 'testBefore2', function(d, value,oldValue) { result.push('before2:[' + value + ',' + oldValue + ',' + d.result +']'); return ++d.result; }) //后置得到前面正确修改的值 obj.on('test', 'testAfter', function(d, value,oldValue) { result.push('after:[' + value + ',' + oldValue + ',' + d.result +']'); }) obj.test = 2; expect(result.join(',')).toBe('before:[2,1,undefined],before2:[2,1,3],after:[4,1,4]'); expect(obj.test).toBe(4);
aop的更新内容介绍到这,下一篇介绍oop
SmartJS的GitHub地址
相关文章推荐
- LGame-0.3(Android与JavaSE游戏引擎)正式发布,新增SRPG制作模块
- win7 IIS7 发布网站 出现 "处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”"
- RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->用户管理模块新增“重置用户密码”功能
- IIS发布网站浏览之后看到的是文件目录 & Internal Server Error 处理程序“ExtensionlessUrlHandler-ISAPI-4.0_64bit”在其模块列表中有一个错误模块“IsapiModule” 解决方法 & App_global.asax.pduxejp_.dll”--“拒绝访问。 ”
- UCKeFu 1.4.0 发布,新增了工单管理模块
- "面向切面(AOP)"与"面向对象(OOP)"(图)
- RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->用户管理模块新增“重置用户密码”功能
- Nginx发布1.9.0版本,新增支持TCP代理和负载均衡的stream模块
- win7 IIS7 发布网站 出现 "处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误
- "高可用方案工具包" high availability toolkit 1.2 发布了。version 1.2 新增了 负载均衡 load balance 的技术实现
- win7 IIS7 发布网站 出现 "处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误"
- RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->用户管理模块新增“重置用户密码”功能
- Python 3.5发布:新增模块,性能优化,对开发者更友好
- "面向切面(AOP)"与"面向对象(OOP)"
- smartjs 0.2 OOP讲解 - factory
- PO-->OOP+AOP-->SOA软件开发思想演化
- RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->新增模块管理界面导出功能(可按条件导出)
- "面向切面(AOP)"与"面向对象(OOP)"
- RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->用户管理模块新增“重置用户密码”功能
- smartjs 0.2 OOP讲解 - Klass 类继承