/** The function that we use to fetch/calculate a session id */ Java代码 dwr.engine._getScriptSessionId = function() { if (dwr.engine._scriptSessionId == null) { dwr.engine._scriptSessionId = dwr.engine._origScriptSessionId + Math.floor(Math.random() * 1000); } return dwr.engine._scriptSessionId; };
scriptSessionId是通过原始的脚本SessionId加上一个随机数得到的。parameters:{}参数; headers:{},http请求的头信息;handlers:{}处理器对象;preHooks:[],我把它叫做前勾,作用是在调用服务器的组件的时候,类似一个代理,如果preHooks存在,我先调用它的内容,然后再调用web组件的内容,最后调用postHooks。对于Demo.sayHello = function(p0,callback){dwr.engine._execute(Demo._path,'Demo','sayHello',p0,callback);},它会先调用preHooks的内容,接着执行请求,然后调用postHooks的内容。rpcType:dwr.engine._rpcType指的是请求的类型。因为dwr框架并不是仅仅针对xml、httprequest,它还会针对其他的请求类型:iframe、scriptshell脚本。httpMethod:dwr.engine._httpMethod指的是请求方法:post或者get,在dwr框架中,只允许这两种方式,其它的方式是不允许的。
async:dwr.engine._async,指的是异步还是同步,在ajax中,open的最后一个参数为true就是异步,false就是同步。如果为false来讲,用ajax就没有什么意义,所以一般来讲就是true.timeout:dwr.engine._timeout,指的是请求的超时时间。
接下来看execute方法是怎么将vararg_params分割长参数和回调函数的?
由于vararg_params里面包含了方法的参数以及回调函数,由于execute里面要调用回调函数,因此必须进行方法的参数和回调函数的分割。把参数放到参数的数组中,回调函数放到回调函数的变量中。
var args = [];用来放置方法的参数,去除回调函数以外的用来调用的方法的参数。
看看下面的代码:
for (var i = 0; i < arguments.length - 3; i++) { args[i] = arguments[i + 3]; } // All the paths MUST be to the same servlet if (batch.path == null) { batch.path = path; } else { if (batch.path != path) { dwr.engine._handleError(batch, { name:"dwr.engine.multipleServlets", message:"Can't batch requests to multiple DWR Servlets." }); return; } } for (var i = 0; i < arguments.length - 3; i++) { args[i] = arguments[i + 3]; } // All the paths MUST be to the same servlet if (batch.path == null) { batch.path = path; } else { if (batch.path != path) { dwr.engine._handleError(batch, { name:"dwr.engine.multipleServlets", message:"Can't batch requests to multiple DWR Servlets." }); return; } }
在javascript中,创建一个函数,它有一个隐式的参量arguments,这个arguments相当于我这个函数调用时传进去的几个参数,而且这几个参数都是放置在arguments里面的,它并不是隐式的显示出来,因为弱类型的语言,参数列表个数不同可以调用同一个函数。arguments负责把所有的参数存放在里面。