论坛首页 Web前端技术论坛

javascript执行顺序的疑问?

浏览 17062 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-05-31  
近日,在写一个JS函数发现了一个问题,其实这个很早就发现了.不过不是很在意。
可是当需要函数的返回值的时候,就出麻烦了。请看:
function getMap(domainId);
{
    var temp;
    //DWR调一个服务,callback是一个回调函数,实现赋值功能
    PubDomainItemDao.getMap(domainId , {callback: function(data);{temp= data;}});;
    return temp;   
}
alert(getMap("test"););;

这样alert出来的值是undefine.
OK,加一个小东东
function getMap(domainId);
{
    var temp;
    //DWR调一个服务,callback是一个回调函数,实现赋值功能
    PubDomainItemDao.getMap(domainId , {callback: function(data);{temp= data;}});;
    alert("getMap");;//就只加了这一句
    return temp;   
}
alert(getMap("test"););;

这次getMap()的返回值就是一个[Object]了,赋值成功!
通过这个例子,我们看出当js调用一个其他函数的时候,是异步的,原程序还是会并行执行的。难道它是异步的方式?怀疑中
如何解决这个问题呢?
   发表时间:2006-05-31  
你是错的。
dwr的回调函数和xmlhttp异步的回调函数不一样。
0 请登录后投票
   发表时间:2006-05-31  
我觉得是因为你加了一个alert,使程序执行中断。

正好等待的这段时间,接收到了返回值~
0 请登录后投票
   发表时间:2006-05-31  
todd_lee 写道
我觉得是因为你加了一个alert,使程序执行中断。

正好等待的这段时间,接收到了返回值~

我也觉得是这样,可是如何正确设置返回值呢?
让他有个返回值呢?
0 请登录后投票
   发表时间:2006-05-31  
zkj_beyond 写道
你是错的。
dwr的回调函数和xmlhttp异步的回调函数不一样。

想了一个晚上,想不出怎么正确返回值。
zkj_beyond,给个建议吧。
0 请登录后投票
   发表时间:2006-06-01  
奇怪,我怎么没碰到这样的问题?摘一段代码:
function checkAccountName();{
	
	AccountService.hasAccount( $F("accountName");,drawCheckedAccountName);;	
}



function drawCheckedAccountName(result);{
	if(result==true);{
	//do something....		
	}else{
	//do something....			
	}     
}

正常的返回了结果
0 请登录后投票
   发表时间:2006-06-01  
引用
搬个板凳看zkj_beyond解决问题

:oops:  我是这样想的
引用

function getMap(domainId)
{
    var temp;
    //DWR调一个服务,callback是一个回调函数,实现赋值功能
    PubDomainItemDao.getMap(domainId , {callback: function(data){alert(data);temp= data;}});
    alert("getMap");//就只加了这一句
    return temp;   
}
alert(getMap("test"));


代码改成这样,可以看到,回调函数还是一往无前的执行,无视你的   alert("getMap");//就只加了这一句
PubDomainItemDao.getMap(domainId , {callback: function(data){alert(date);temp= data;}});

理论上javascript的alert会停止代码执行,但dwr在其控制器servlet中out.print了一段javascript代码执行回调代码,不会等到我们点击确认,直接执行代码。 (具体原理我也没仔细研究,反正是alert("getMap");没有阻止代码运行)。


如果你在最前面改: DWREngine._method=2,用iframe模式的话,结果就不一样了。
0 请登录后投票
   发表时间:2006-06-01  
lz可以用下面方法测试一下。
xmlhttp.open("","servlet url",true);
调用servlet,然后在servlet中out.print("<script>alert()</script>");
测试一下代码。

dwr与我们一般用xmlhttp方法有些区别,我们一般从xmlhttp中得到结果,而dwr是把结果在服务器端转化成javascript代码,用servlet的out打印出来,并执行回调代码。

我感觉,用dwr回调函数的设计是个挑战,不小心会产生层次很深的回调链。dwr提供批量执行服务器方法的功能,可能是解决这个问题的方法。
0 请登录后投票
   发表时间:2006-06-01  
spring嘟嘟 写道
不过有个问题,如果取得数据时间很长,这样还是有效不?

原理上好像说不过去。。

估计只能用 loding data....来屏蔽用户操作了。
我觉得xmlhttp的异步操作如果用不好可能带来很大的问题。坛子里好像还有人鼓励都用异步 ,我觉得合理的用dwr批量操作是个好办法,但可能会有dudu的问题。
不知道dudu是什么应用。想想google maps的异步下载地图,其实这个”异步“是交给 img对象来实现的。并我们大多数人想的xmlhttp的一个参数。

所以,ajax的“异步”并不只指请求时的一个参数,可能有别的解决方法。


http://getahead.ltd.uk/dwr/browser/extradata
dwr也说闭包可能解决一些问题。但这种全局的函数太多是个问题。http://www.blogjava.net/zkjbeyond/archive/2006/05/25/48069.html关于事件注册,我想会有个好的模式出现的。

如果像楼主那样把服务器方法当本地方法调用,估计是没有解决方法的。想想webservice的调用就可以了,那么多年了,用的还是回调函数。
0 请登录后投票
   发表时间:2006-06-01  
无明 写道
奇怪,我怎么没碰到这样的问题?摘一段代码:
function checkAccountName();{
	
	AccountService.hasAccount( $F("accountName");,drawCheckedAccountName);;	
}



function drawCheckedAccountName(result);{
	if(result==true);{
	//do something....		
	}else{
	//do something....			
	}     
}

正常的返回了结果

这样写是不会出错的。
我的例子里面主要是返回值出现了问题。
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics