使用同步获取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://hilijx.blog.163.com/blog/static/110223782201131293831483/

 

自己代码使用:

function checkAirport(){
		var cityArr = [];
		var apArr = [];
		jQuery("input[id^='airportcode']").each(function() {
			var citycode = jQuery(this).parent().prev().html();			
			var code = jQuery(this).val();
			cityArr[cityArr.length] = citycode;
			apArr[apArr.length] = code;
		})
		var res = "";
		DWREngine.setAsync(false);
		ZonesEvent.checkAirportCode(cityArr,apArr, function(obj){
				if (obj != null) {
					if(obj == ""){
						res = true;
					}else{
						alert(obj);			
						res = false;
					}					
				} else {
					alert("@TW出錯了.請再來一次@@CN出错了.请再来一次@@ENError.Please try again@.");
				}		
		});	
		DWREngine.setAsync(true);
		//alert("res:"+res);
		return res;
	}

 。。。

 

程序中 异步和同步是啥意思?

异步调用是通过使用单独的线程执行的。原始线程启动异步调用,异步调用使用另一个线程执行请求,而与此同时原始的线程继续处理。

同步调用则在继续之前必须等待响应或返回值。如果不允许调用继续即无响应或返回值,就说调用被阻塞了,不能继续执行。


就好比说,向服务器端发送请求,如果不需要服务器响应就是异步,如果需要服务器返回信息就是同步 


同步,

主机A发送数据的时候,主机B必须等待接收,处于阻塞状态,这就好比别人给你打电话,你必须当场听话,否则则【错失良机】

异步

主机A发送数据的时候,主机B无须等待接收,主机B要获得数据就从缓存里取,就好比别人给你发邮件一样 

 

 

你可能感兴趣的:(回调函数)