DWR 同步操作, 取得回调函数的返回值

DWR是Ajax的一个开源框架,可以很方便是实现调用远程java类。但是,DWR只能采用回调函数方法,在回调函数获取返回值,然后进行处理。那么,到底有没有办法直接获取一个方法的放回值呢?
下面我写一个简单的java类,如下:
public class test()
{
public String getString()
{
return "test";
}
}
上面这个类很简单,里面的getString就直接返回一个字符串。
我们假设在DWR中配置了Test在DWR中所对应的类未JTest,那么我们要调用getString方法,可以这样写:
function test()
{
//调用java类Test的getString方法,callBackFun为回调函数
JTest.getString(callBackFun);
//回调函数
function callBackFun(data)
{
alert(data);
}
}
这里处理很简单,就是调用java类方法,然后在回调函数中处理,上面那段话执行后会显示test,也就是java方法的返回值。但是,采用回家函数不符合我们的习惯,有些时候我们就想直接获取返回值进行处理,这时候就无能为力了。
我们知道,DWR是Ajax的框架,那么必然拥有了Ajax的特性了。
先来说说Ajax的运行原理吧,其实它的原理很简单,就是调用远端地址,获取页面返回数据,然后进行分析处理。而这个过程是异步的,就就是为什么DWR采用回调函数的原因了,而你不知道,我们调用java类后,回调函数不知道什么时候执行。
再来看看Ajax的方法,其中,XMLHttpRequest的open函数是有一个是否同步参数,如下:
XMLHttpRequest.open(String method,String URL,boolean asynchronous)
其中的asynchronous就是是否同步的参数了。
现在,让我们打开DWR的engine.js文件搜索一个asyn,马上,就发现了一个setAsync方法,原来,DWR是这个方法设置成属性封装起来了。这样,我们就可以实现获取返回值的功能了。
下面,我在DWR中封装出java类,如下:
function test()
{
var _data = "";
this.getString = function()
{
//设置成同步
DWrengine.setAsync(false);
//调用java类Test的getString方法,callBackFun为回调函数
JTest.getString(callBackFun);
//重新设置为异步方式
DWrengine.setAsync(true);
return _data;
}
//回调函数
function callBackFun(data)
{
_data = data;
}
}
上面这个方法,在调用java方法之前先设置为同步方式,那么调用java方法后,执行了回调函数后,才接着执行下面的语句,这样子,返回_data就已经赋值了,所以可以正常获取值。
上面这些写法比较麻烦,可以写成下面方式:
function test()
{
var _data = "";
this.getString = function()
{
//设置成同步
DWrengine.setAsync(false);
//调用java类Test的getString方法,callBackFun为回调函数
JTest.getString(function(data){_data = data;});
//重新设置为异步方式
DWrengine.setAsync(true);
return _data;
}
}

相关文章

IE6是一个非常老旧的网页浏览器,虽然现在很少人再使用它,但...
PHP中的count()函数是用来计算数组或容器中元素的个数。这个...
使用 AJAX(Asynchronous JavaScript and XML)技术可以在不...
Ajax(Asynchronous JavaScript and XML)是一种用于改进网页...
本文将介绍如何通过AJAX下载Excel文件流。通过AJAX,我们可以...
Ajax是一种用于客户端和服务器之间的异步通信技术。通过Ajax...