ajax框架dwr自定义同步异步--解决回调函数中处理无法得到预期结果问题
2012-02-22 10:39
666 查看
这几天用到dwr在回调函数中给变量赋值的时候总是有时候对有时候错,搞的很郁闷,后来百度了下才知道原来是同步异步的问题,应为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;
}
}
原文链接:http://hi.baidu.com/wmkoyo/blog/item/7df44c7a446c4fe82f73b3af.html
相关文章推荐
- 使用dwr同步调用导致无法获取js方法的返回结果问题的解决办法
- [异步][事务][流程][设计]同步当场处理并返回处理结果,异步后如何返回. 如何解决?
- 利用async和await异步操作解决node.js里面fs模块异步读写,同步结果的问题
- [异步][事务][流程][设计]同步当场处理并返回处理结果,异步后怎样返回. 怎样解决?
- 对常规启用 IIS6.0 Gzip 方法的补充,用于解决wget、curl等无法得到压缩结果的问题
- 解决"System.AccessViolationException”类型的未经处理的异常在 未知模块(IIS Worker Process 已停止工作)导致无法连接远程数据库的问题
- hadoop 安装出现的几种异常的处理方法,hadoop无法启动,no namenode to stop问题的解决方法,no datanode
- ora-12154: tns: 无法处理服务名的报错问题解决
- Hibernate审计日志时业务数据无法同步问题解决
- 关于V5.7 正式版 自定义字段图片上传无法点击选择的问题解决!
- UITableView获取cell的row值(解决自定义cell里的button通过点击无法获得cell的indexpath的问题)
- 关于Python2.7得到结果乱码的问题解决办法
- 解决chrome浏览器无法得到window.showModalDialog返回值的问题
- jquery异步ajax超大长度base64图片长字段数据传输问题解决办法和php后台处理办法
- ajax是什么? ajax的交互模型? 同步和异步的区别? 如何解决跨域问题?
- ocs(office communications server)通讯簿无法同步的问题集锦及解决方法
- AngularJS出现$http异步后台无法获取请求参数问题的解决方法
- HTML5异步上传图片(支持预览和进度条),使用其他按钮触发file onclick事件,解决某些浏览器无法触发的问题
- 在ScrollView中自定义GridView无法显示全部的问题的解决
- 一个S2S通信中的同步、异步问题的解决