锁定老帖子 主题:javascript执行顺序的疑问?
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-05-31
可是当需要函数的返回值的时候,就出麻烦了。请看: 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调用一个其他函数的时候,是异步的,原程序还是会并行执行的。难道它是异步的方式?怀疑中 如何解决这个问题呢? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2006-05-31
你是错的。
dwr的回调函数和xmlhttp异步的回调函数不一样。 |
|
返回顶楼 | |
发表时间:2006-05-31
我觉得是因为你加了一个alert,使程序执行中断。
正好等待的这段时间,接收到了返回值~ |
|
返回顶楼 | |
发表时间:2006-05-31
todd_lee 写道 我觉得是因为你加了一个alert,使程序执行中断。
正好等待的这段时间,接收到了返回值~ 我也觉得是这样,可是如何正确设置返回值呢? 让他有个返回值呢? |
|
返回顶楼 | |
发表时间:2006-05-31
zkj_beyond 写道 你是错的。
dwr的回调函数和xmlhttp异步的回调函数不一样。 想了一个晚上,想不出怎么正确返回值。 zkj_beyond,给个建议吧。 |
|
返回顶楼 | |
发表时间:2006-06-01
奇怪,我怎么没碰到这样的问题?摘一段代码:
function checkAccountName();{ AccountService.hasAccount( $F("accountName");,drawCheckedAccountName);; } function drawCheckedAccountName(result);{ if(result==true);{ //do something.... }else{ //do something.... } } 正常的返回了结果 |
|
返回顶楼 | |
发表时间: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模式的话,结果就不一样了。 |
|
返回顶楼 | |
发表时间: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提供批量执行服务器方法的功能,可能是解决这个问题的方法。 |
|
返回顶楼 | |
发表时间: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的调用就可以了,那么多年了,用的还是回调函数。 |
|
返回顶楼 | |
发表时间:2006-06-01
无明 写道 奇怪,我怎么没碰到这样的问题?摘一段代码:
function checkAccountName();{ AccountService.hasAccount( $F("accountName");,drawCheckedAccountName);; } function drawCheckedAccountName(result);{ if(result==true);{ //do something.... }else{ //do something.... } } 正常的返回了结果 这样写是不会出错的。 我的例子里面主要是返回值出现了问题。 |
|
返回顶楼 | |