最近在研究dojo底层代码的时候,发现dojo竟然实现了类似于spring面向切面的概念--dojo/aspect。
喜欢英文的同学可以直接去dojo的官网查看API,翻译的毕竟失去原本的意境。
aspect提供了三个方法--after、before和around。相信熟悉spring切面的同学应该知道,切面对于权限、日志等功能提供了很方便的方法。aspect主要是在后台请求的过程中使用,下面具体说一下这些方法到底可以做些什么。
after:在调用xhr的ajax请求之后,可以使用这个方法,对返回结果进行统一的处理,这样就不用在每个xhr的请求处理函数中进行相同的操作,比如将返回数组转为jso
//此方法绑定一次,只要调用xhr的方法,就会触发下面的after内部的function define(["dojo/aspect"], function(aspect){ aspect.after(dojo, "xhr", function(deferred){ return deferred.then(function(response){ //当调用ajax成功后,会进入此方法 //之后我们就可以统一将response格式化成json return dojo.fromJson(response); },function(err){ //出现错误时会进入此函数 console.info(err); },function(evt){ //如果浏览器支持XHR2则从请求处理时间进展 console.info(evt); }); }); });before:在调用ajax请求之前进行最后的操作,比如传入参数,修改请求方式等
此方法绑定一次,只要调用xhr的方法,就会触发下面before内部的function define(["dojo/aspect"], function(aspect){ aspect.before(dojo, "xhr", function(method, args){ //可以修改请求的方式 if(method == "PUT"){ args.url += "?x-method=PUT"; method = "POST"; } //可以传入统一的参数 args.url += "?userId=userId"; return [method, args]; }); });around:请求过程中处理时间
define(["dojo/aspect"], function(aspect){ aspect.around(dojo, "xhr", function(originalXhr){ return function(method, args){ //调用之前处理 //TODO var deferred = originalXhr(method, args); //调用之后处理 //TODO return deferred; } }); });