DWR学习2-回调函数异步问题
来源:互联网 发布:红叶知弦 编辑:程序博客网 时间:2024/06/04 17:43
一、问题的提出
DWR可以很方便实现调用服务器端的Java类。但是,DWR只能采用回调函数的方法,在回调函数中获取 返回值,然后进行处理。但是,在我的工作中遇到一些问题,由于回调函数是异步的,经常出现当函数还没返回,而代码继续向下执行,表单就已经提交,这种情况 下就会出现返回的数据没返回完,数据显示一半、回调函数不调用等问题。
二、问题的举例
下面我们举例说明:
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方法的返回值。但是,采用回调函数不符合我们的习惯,有些时候我们就想直接获取返回值进行处理,这时候就无能为力了。
三、问题的原因及解决
Java是同步的,Ajax是异步的。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;
}
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方法的返回值。但是,采用回调函数不符合我们的习惯,有些时候我们就想直接获取返回值进行处理,这时候就无能为力了。
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;
}
0 0
- DWR学习2-回调函数异步问题
- dwr 回调函数
- ajax框架dwr自定义同步异步--解决回调函数中处理无法得到预期结果问题
- dwr回调函数不执行的问题
- DWR基本环境配置,回调函数不执行问题
- dwr回调函数设置参数
- 回调函数 异步执行
- 回调函数学习
- 回调函数 学习
- 回调函数学习
- dwr中回调函数带参数写法
- DWR 回调函数与主函数变量传递
- DWR 同步操作, 取得回调函数的返回值
- 在回调函数外访问dwr返回值
- JS不能得到Dwr中回调函数中的内容
- 使用Extjs周期性调用dwr回调函数
- DWR 同步操作, 取得回调函数的返回值
- 使用同步获取DWR回调函数的返回值
- swift快速入门,三分钟上手
- 浅析GLib
- Java-取得服务器当前的各种具体时间
- 磁场强度简介
- OOAD作业---设计模式---装饰者模式
- DWR学习2-回调函数异步问题
- 数据结构——算法之(025)( 求一个数组的最长递减子序列)
- 利用Cookie显示用户上次访问网站的时间
- Redis应用场景
- ActiveMQ安装与运行
- CHD4安装hadoop2.0
- hdu 4770 Lights Against Dudely
- 基于linux2.6.30.4内核的DM9000网卡驱动编译成模块成功ping通
- 回收站的文件清空了怎么才能找回来呢