在DWR回调函数异步问题

本文介绍如何在DWR框架中使用同步调用的方式获取Java远程方法的返回值,通过改变DWR默认的异步行为,实现直接获取返回值的需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 DWR可以很方便实现调用远程Java类。但是,DWR只能采用回调函数的方法,在回调函数中获取返回值,然后进行处理。但是,在我的工作中遇到一些问题,由于回调函数是异步的,经常出先当函数还没返回,而代码继续向下执行,表单就已经提交。

 

   public class Test()

{

    public String getString()

    {

        return "test";

    }

}

    上面这个类很简单,里面的getString就直接返回一个字符串。

   假设在DWR中配置了TestDWR中所对应的类未JTest,那么我们要调用getString方法,可以这样写:

function Test()

{

    //调用JavaTestgetString方法,callBackFun为回调函数

    JTest.getString(callBackFun);

   

    //回调函数

    function callBackFun(data)

    {

        alert(data);

    }

}

 

   这里处理很简单,就是调用java类的方法,然后在回调函数中处理,上面那段话执行后会显示test,也就是java方法的返回值。但是,采用回调函数不符合我们的习惯,有些时候我们就想直接获取返回值进行处理,这时候就无能为力了。

 

DWRAjax的框架,那么必然拥有了Ajax的特性了。

 

   Ajax调用远端地址,获取页面返回数据,然后进行分析处理。而这个过程是异步的,就就是为什么DWR采用回调函数的原因了,而我们并不知道调用了Java类后,回调函数不知道什么时候执行。什么时候执行完毕。

Ajax的方法,其中,XMLHttpRequestopen函数是有一个是否同步参数,如下:

XMLHttpRequest.open(String method, String URL, boolean asynchronous)

其中的asynchronous就是是否同步的参数了。

现在,让我们打开DWRengine.js文件,搜索一个asyn,马上,就发现了一个setAsync方法,原来,DWR是这个方法设置成属性封装起来了。这样,我们就可以实现获取返回值的功能了。

下面,我在DWR中封装出Java类,如下:

function Test()

{

    var _data = "";

   

    this.getString = function()

    {

        //设置成同步

        DWREngine.setAsync(false);

       

        //调用JavaTestgetString方法,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);

       

        //调用JavaTestgetString方法,callBackFun为回调函数

        JTest.getString(function(data){_data = data;});

       

        //重新设置为异步方式

        DWREngine.setAsync(true);

       

        return _data;

    }

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值