批量调用

你可以使用 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"
});