SmartJS2.0发布,更新内容如下:

  1. 新增oop(klass,factory)模块;
  2. promiseEvent加入非阻塞模式noBlock;
  3. trigger加入属性监听;
  4. smartjs主模块优化,支持requirejs和seajs;
  5. 单元测试页面优化;

先介绍一下针对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地址

smartjs 0.2发布 - 新增oop模块&AOP增强的更多相关文章

  1. SmartJS 第一期(0.1)发布 - AOP三剑客

    隔了好久才终于又发布了一点东西,SmartJS是最近才开始搞的一个开源js库,目的是做一些比较有特点的事情(smartjs暂时也是依赖于jquery). SmartJS的内容规划比较多,也无法在短时间 ...

  2. SpringBoot2.0 基础案例(11):配置AOP切面编程,解决日志记录业务

    本文源码 GitHub地址:知了一笑 https://github.com/cicadasmile/spring-boot-base 一.AOP切面编程 1.什么是AOP编程 在软件业,AOP为Asp ...

  3. [译]ABP框架v2.3.0已经发布!

    在新冠病毒的日子里,我们发布了ABP框架v2.3, 这篇文章将说明本次发布新增内容和过去的两周我们做了什么. 关于新冠病毒和我们的团队 关于冠状病毒的状况我们很难过.在Volosoft的团队,我们有不 ...

  4. Spring.Net.FrameworkV3.0 版本发布了,感谢大家的支持

    Spring.Net.FrameworkV3.0 版本发布了,感谢大家的支持. Spring.Net.Framework,基于.NET的快速信息化系统开发.整合框架,为企业或个人在.NET环境下快速开 ...

  5. hadoop2.6.0汇总:新增功能最新编译 32位、64位安装、源码包、API下载及部署文档

    相关内容: hadoop2.5.2汇总:新增功能最新编译 32位.64位安装.源码包.API.eclipse插件下载Hadoop2.5 Eclipse插件制作.连接集群视频.及hadoop-eclip ...

  6. 【AngularJS】 2.0 版本发布

    [AngularJS] 2.0 版本发布 w5cValidator[AngularJS] 2.0 版本发布   w5cValidator 插件基于angular原有的表单验证,在原有的基础上扩展了一些 ...

  7. 迷你MVVM框架 avalonjs 0.85发布

    迷你MVVM框架 avalonjs 0.85发布 本版本对循环绑定做了巨大改进,感谢@soom, @limodou, @ztz, @Gaubee 提供的大量测试文件. fix scanNodes, 在 ...

  8. springboot2.0(一):【重磅】Spring Boot 2.0权威发布

    就在昨天Spring Boot2.0.0.RELEASE正式发布,今天早上在发布Spring Boot2.0的时候还出现一个小插曲,将Spring Boot2.0同步到Maven仓库的时候出现了错误, ...

  9. 意料之外,情理之中,Spring.NET 3.0 版本发布-

    意料之外,情理之中,Spring.NET 3.0 版本发布- 备受社区和企业开发者广泛关注的Spring.NET在上周发布了3.0版本,并且目前已经保持着持续的更新,让我们一起来看一看他究竟发布了哪些 ...

随机推荐

  1. atitit.提升软件开发的效率and 质量的那些强大概念and方法总结

    atitit.提升软件开发的效率and 质量的那些强大概念and方法总结 1. 主流编程中三个最糟糕的问题 1 1.1. 从理解问题后到实现的时间很长 1 1.2. 理解和维护代码  2 1.3. 学 ...

  2. paip.突破 网站 手机 验证码 的 破解 总结

    paip.突破 网站 手机 验证码 的 破解 总结  作者Attilax  艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn ...

  3. 从零开始学Bootstrap(2)

    继从零开始学Bootstrap(1)后,我们需要实际做一些页面,边学边做.因为前端是一项非常注意实践的技术,知识点太多.太琐碎了,所以我们只能边学边做.根据我们想要做的效果,去查相应的资料.不要想着把 ...

  4. HTML5之语义化标签

    HTML 5的革新之一:语义化标签一节元素标签. 在HTML 5出来之前,我们用div来表示页面章节,但是这些div都没有实际意义.(即使我们用css样式的id和class形容这块内容的意义).这些标 ...

  5. Delphi 如何让程序获取权限结束指定进程?

    比如说让程序结束进程中360sd.exe 获取权限,否则会拒绝访问, 要怎么写?   补充: 这段代码中……点击按钮后结束不了360进程! unit Unit1;interfaceusesWindow ...

  6. JavaScript中如何中断forEach循环

    先来看下forEach的实现 // Production steps of ECMA-262, Edition 5, 15.4.4.18// Reference: http://es5.github. ...

  7. Cocos2dx.3x入门三部曲-软件环境配置(一)

    一.环境: Win7 32位 二.必备软件: l  Java JDK 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/inde ...

  8. 一个purge参数引发的惨案——从线上hbase数据被删事故说起

    在写这篇blog前,我的心情久久不能平静,虽然明白运维工作如履薄冰,但没有料到这么一个细小的疏漏会带来如此严重的灾难.这是一起其他公司误用puppet参数引发的事故,而且这个参数我也曾被“坑过”.   ...

  9. HiveServer2 的jdbc方式创建udf的修改(add jar 最好不要使用),否则会造成异常: java.sql.SQLException: Error while processing statement: null

    自从Hive0.13.0开始,使用HiveServer2 的jdbc方式创建udf的临时函数的方法由: ADD JAR ${HiveUDFJarPath} create TEMPORARY funct ...

  10. WebSocket桌面客户端工具

    考虑到WebSocket的诸多优点和未来的趋势,去年底把服务端通讯全部由HTTP改成WebSocket,期间为了方便测试,做了这个小工具.共享出来以方便有同样需求的程序员. 下载的压缩包里含有源代码和 ...