批量调用
你可以使用 batch 来批量的执行远程调用。这样可以减少与服务器的交互次数,所以可以提交反应速度。
一个 batch 以 DWREngine.beginBatch() 开始 ,并以 DWREngine.endBatch() 结束。当DWREngine.endBatch() 被调用,我们就结束了远程调用的分组,这样 DWR 就在一次与服务器的交互中执行它们。
DWR 会小心的处理保证所有的回调函数都会被调用,所以你可以明显的打开和关闭批处理。只要别忘了调用 endBatch(),否则所有的远程调用永远的处于列队中。
警告:很明显,把一些远程调用放在一起执行也会产生一些影响。例如不能在 batch 里面执行同步调用。
所有的元数据选项,例如 hooks, timeouts 和 errorHandlers 都在 batch 级别的,而不是单次调用级别上的。
所以如果一个 batch 中有两个调用设置了不同的超时,除了最后一个其他的都被忽略。
顺序调用
因为 Ajax 一般是异步调用,所以远程调用不会按照发送的顺序返回。DWREngine.setOrdered(boolean) 允许结果严格按照发送的顺序返回。DWR 在旧的请求安全返回以后才去发送新的请求。
我们一定需要保证请求按照发送的顺序返回吗?(默认为 false)
警告 : 把这个设置为 true 会减慢你的应用程序,如果一个消息丢失,浏览器就会没有响应。很多时候即
使用异步调用也有更好的解决办法,所以在用这一功能之前先好好考虑一下。
错误警告和超时
- 处理错误和警告
当因为一些原因调用失败,DWR 就会调用错误和警告 handler(根据错误的激烈程度),并传递错误消息。
你可以用这种方法来在 alert 窗口或状态来中显示错误信息。
你可以使用 DWREngine.setErrorHandler(function)来改变错误处理方式,同样通过
DWREngine.setWarningHandler(function)
来改变警告处理方式。
-设置超时
DWREngine.setTimeout(),单次调用和批量调用级别的元数据选项,允许你设置一个超时值。全局的DWREngine.setTimeout()函数设置全局超时。如果设置值为 0(默认)可以将超时关掉。
setTimeout()的单位是毫秒。如果调用超时发生,错误处理器就会被调用。
-一个例子:
Remote.method(params, { callback:function(data) { alert("it worked"); }, errorHandler:function(message) { alert("it broke"); }, timeout:1000 });
如果 Remote.method()调用超过了 1 分钟还没有返回,"it broke"消息就会被显示。
远程调 Hooks
DWREngine.setPreHook(function) 和 DWREngine.setPostHook(function) 。
如果你想在 DWR 调用之前出现一个提示,你可以设置 pre-hook 函数。它将会被调用,但是没有参数传递到这个函数。当你希望让一些按钮在调用期间变灰来防止被再次使用,这一功能将会很有用。
post-hook 用来和 pre-hook 一起使用来逆转 pre-hook 产生的做的一些改变。
一个使用 pre 和 post hook 的例子就是 DWRUtil.useLoadingMessage() 函数。
远程调用选项
DWR 有一些选项用来控制远程调用的处理方式。method 和 verb 对于用户应该时透明的,但是不同的浏览器效果的可能不一样。一般来说 DWR 会选择正确方法来处理,但是这些选项对于在不同效果的浏览器之间开发很有用。
- DWREngine.setAsync(flag)
DWR1.0 不支持。
我们指定让 XHR 异步调用了吗? 默认为 true。警告如果你使用的时 IFrame 或者 ScriptTag 这一选项被忽略。一般来说把他变成 false 是个糟糕的做法。因为那样会使你的浏览器变慢。
要设置全局同步机制:
DWREngine.setAsync(true);
或者设置单次调用同步:
Remote.method(params, { callback:function(data) { ... }, async:true });
或者在 batch 里面:
DWREngine.beginBatch(); Remote.method1(params, callback1); Remote.method2(params, callback2); DWREngine.endBatch({ async:true });
- DWREngine.setMethod(newmethod)
用来设置恰当的方法。setMethod()不能把正使用你选择的方法,它只是保证首先尝试使用那个方法。
newmethod 必须是 DWREngine.XMLHttpRequest 或者 DWREngine.IFrame,或者 2.0 以后的DWREngine.ScriptTag。
XMLHttpRequest 时默认的,并且大多情况下可用。当 ActiveX 禁用 IFrame 就有用了,尽管 DWR能自动检测出这种情况并切换到 IFrame。当你要突破跨域调用的限制,ScriptTag 就很有用了。
例如,要设置全局的远程调用方法:
DWREngine.setMethod(DWREngine.IFrame);
或者设置单次调用同步:
Remote.method(params, { callback:function(data) { ... }, method:DWREngine.IFrame });
或者在 batch 里面:
DWREngine.beginBatch(); Remote.method1(params, callback1); Remote.method2(params, callback2); DWREngine.endBatch({ method:DWREngine.IFrame });
- DWREngine.setVerb(verb)
这个选项允许你选择 POST 和 GET,无论时用 iframe 还是 XMLHttpRequest 方法。一些浏览器(例如,
旧版的 Safari)不支持 XHR-POST 所以 DWR 就自动切换到 GET,即使你设置 POST 为 verb。所以setVerb()应当被仅仅做为一个堤示。
如果使用 ScriptTag 来远程调用,设置 verb 时没有的。
例如,设置全局远程调用的 verb:
DWREngine.setVerb("GET");
或者设置单次调用同步:
Remote.method(params, { callback:function(data) { ... }, verb:"GET" });
或者在 batch 里面:
DWREngine.beginBatch(); Remote.method1(params, callback1); Remote.method2(params, callback2); DWREngine.endBatch({ verb:"GET" });