锁定老帖子 主题:javascript执行顺序的疑问?
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-06-01
zkj_beyond 写道 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的调用就可以了,那么多年了,用的还是回调函数。 我后来写了一个递归的方式,结果JS出现了stack overflow function getMap(domainId ,state); { var temp; //DWR调一个服务,callback是一个回调函数,实现赋值功能 //state=true,不再执行调服务的操作 if(state!=true); PubDomainItemDao.getMap(domainId , {callback: function(data);{temp= data;}});; //如果temp已经得到赋值,那么返回它 if(temp!=undefined); return temp; else return getMap(domainId ,true);;//如果没得到赋值,则递归调用getMap,并赋予state=true,以防止重复执行PubDomainItemDao.getMap服务.执行后提示本行stack overflow!!! } 我是没招了 |
|
返回顶楼 | |
发表时间:2006-06-01
zkj_beyond 写道 所以,ajax的“异步”并不只指请求时的一个参数,可能有别的解决方法。 http://getahead.ltd.uk/dwr/browser/extradata dwr也说闭包可能解决一些问题。但这种全局的函数太多是个问题。http://www.blogjava.net/zkjbeyond/archive/2006/05/25/48069.html关于事件注册,我想会有个好的模式出现的。 我现在用prototype的bind来解决这个问题。 比如: .... remoteDao.save(objToSave,this.onSave.bind(this););; .... 这样,在this.onSave方法被回调执行的时候,里面的this指针实际上指向的就是执行remoteDao.save这个方法的上下文所在的对象,也就是controller对象。在onSave里面想干什麽就干什麽. 一开始我也采用了和闭包类似的办法,后来看着prototype的bind,一直搞不清楚能用来干嘛,直到某天顿悟. 玩java的人要想整明白javascript中this地用法,确实是很难啊. 引用 如果像楼主那样把服务器方法当本地方法调用,估计是没有解决方法的。想想webservice的调用就可以了,那么多年了,用的还是回调函数 这个好像是没办法,除非搞成同步的??? 不过我还是喜欢异步的方式. 异步太解脱了. 使用dwr之后,最难以忍受的是javascript不支持方法的重载/覆写,搞得我异常郁闷. 而且dwr的处理中,覆写方法和父类中被覆写的方法在不同的浏览器里面出现的先后顺序不一样, 后面的会把前面的干掉,但未必是子类的干掉父类的同名方法(ie和firefox好像都不是,opera的却正常), 一开始弄得我一头雾水. 估计以后会改进巴. |
|
返回顶楼 | |
发表时间:2006-06-01
引用 我现在用prototype的bind来解决这个问题。
比如: java代码: .... remoteDao.save(objToSave,this.onSave.bind(this)); .... 其实你还是用了“闭包”。无论如何,dwr都是用eval函数执行服务器返回的javascript代码,可以看看dwr engine.js的handle***代码。另外eval对于闭包好像有特殊情况。 引用 remoteDao.save(objToSave,this.onSave.bind(this)); 以上代码经过测试了吗?我感觉上有问题,本本没环境,明天试试。
引用 使用dwr之后,最难以忍受的是javascript不支持方法的重载/覆写,搞得我异常郁闷. 而且dwr的处理中,覆写方法和父类中被覆写的方法在不同的浏览器里面出现的先后顺序不一样, 后面的会把前面的干掉,但未必是子类的干掉父类的同名方法(ie和firefox好像都不是,opera的却正常), 一开始弄得我一头雾水. 估计以后会改进巴. 看了dwr服务器端代码后,感觉除了加大配置文件的复杂度外,没什么好办法了。 如果使用dwr建议加个Facade层,可以使 业务粒度更粗,减少交互次数,权限控制也可以放到这。 写逻辑层时也没必要专门考虑兼容dwr. |
|
返回顶楼 | |
发表时间:2006-06-02
zkj_beyond 写道 引用 我现在用prototype的bind来解决这个问题。
比如: java代码: .... remoteDao.save(objToSave,this.onSave.bind(this)); .... 其实你还是用了“闭包”。无论如何,dwr都是用eval函数执行服务器返回的javascript代码,可以看看dwr engine.js的handle***代码。另外eval对于闭包好像有特殊情况。 最终肯定是要用闭包或类似的方式来切换这个this. 但是方便很多啊。主要是没有心理负担,感觉上反正是用了prototype的函数,不是自己生写出来的。 另外,按我的理解,onSave这个回调方法是在eval(reply)的过程中被调用,但是本身不是eval出来的。 不过,我对javascript的eval的内部运作不熟悉,是按照java的方式想当然的. 还有,试过几次以后,发现javascript的闭包有那么一点点弱智........ 引用 引用 remoteDao.save(objToSave,this.onSave.bind(this)); 以上代码经过测试了吗?我感觉上有问题,本本没环境,明天试试。
这个已经用在一个项目里面了,运作正常. 引用 看了dwr服务器端代码后,感觉除了加大配置文件的复杂度外,没什么好办法了。 如果使用dwr建议加个Facade层,可以使 业务粒度更粗,减少交互次数,权限控制也可以放到这。 写逻辑层时也没必要专门考虑兼容dwr. 这个只能这样了,要么使用继承,然后搞一些不同名的方法,要么用delegate的方式专门为dwr下个套子. 如果要使用的方法很多,需要改名的很少,从经济角度讲,还是继承的方式代码少一点。当然,这个都是对service而言。 |
|
返回顶楼 | |
发表时间:2006-06-02
引用 remoteDao.save(objToSave,this.onSave.bind(this));
经测试,这种方法是可以的。 prototype.js的bind方法一直不是很感冒,一般人看半天才能想明白。http://www.blogjava.net/zkjbeyond/archive/2006/05/25/48069.html其实就是个apply,call的应用。 其实我觉得dwr的util.js与prototype.js有一点重复功能,util.js有很多针对dwr返回的JSON对象(ajax in action叫法)绑定的方法,很不错。 |
|
返回顶楼 | |
发表时间:2006-06-23
number017 写道 function getMap(domainId); { var temp; //DWR调一个服务,callback是一个回调函数,实现赋值功能 PubDomainItemDao.getMap(domainId , {callback: function(data);{temp= data;}});; return temp; } alert(getMap("test"););; 返回为undefined的原因当然是getMap()函数马上就执行完毕并返回了temp,这时temp还没有被闭包函数付值,根本原因是因为PubDomainItemDao.getMap发送了异步请求后立即返回导致后续代码return temp立即执行,后面你加了一个alert("getMap")后起到了延缓的作用,而且异步模式时xmlhttp对象执行代码却不会被alert()影响,照样在你没点确定时给temp付了值,当然如果返回比较慢或者你点的比较快的话同样会失败 zkj_beyond 写道 你是错的。
dwr的回调函数和xmlhttp异步的回调函数不一样。 虽然不一样,但没有本质区别,dwr的回调函数是DWREngine._stateChange,这里面的那句eval(reply)执行了从服务器上的DefaultExecProcessor.java返回的js代码,DefaultExecProcessor其中有一句是 buffer.append("DWREngine._handleResponse('");; //$NON-NLS-1$ buffer.append(call.getId(););; buffer.append("', ");; //$NON-NLS-1$ buffer.append(ov.getAssignCode(););; buffer.append(");;\n");; //$NON-NLS-1$ 所以返回的js代码里又调用了DWREngine._handleResponse函数来处理,这个函数里面真正的调用了自己的回调函数,看那个call.getId(),它标识的就是回调函数,ov.getAssignCode()返回的则是你的java对象返回的数据,用一个形象的js和java代码的混合语句可以表示为getCallback(call.getId()).apply(null,ov.getAssignCode());所以自己回调函数虽然不是dwr的回调函数,但终究还是以透明的方式被调用的,我们完全可以不管这中间的这些环节 楼主问题的原因在于使用方式不正确,最好还是采用规范的解决方法,callback: function(data){temp= data;}这个内部函用的很不合适,写成这样是最稳妥的做法: function getMap(domainId); { PubDomainItemDao.getMap(domainId, {callback: function(data); {alert(data);;}});; } getMap("test");; 简单而又清楚,闭包用的不熟最好不要乱用,呵呵 |
|
返回顶楼 | |
发表时间:2006-06-26
waterlooz 写道 callback: function(data){temp= data;}这个内部函用的很不合适,写成这样是最稳妥的做法: function getMap(domainId); { PubDomainItemDao.getMap(domainId, {callback: function(data); {alert(data);;}});; } getMap("test");; 简单而又清楚,闭包用的不熟最好不要乱用,呵呵 waterlooz理解做了,我想的用法是 var map = getMap("test"); 而不是alert()一个信息。呵呵。 function getMap(domainId); { var temp; //DWR调一个服务,callback是一个回调函数,实现赋值功能 PubDomainItemDao.getMap(domainId , {callback: function(data);{temp= data;}});; return temp; } var map = getMap("test");; 没有了alert,这时候map也是undefine |
|
返回顶楼 | |
发表时间:2006-06-26
number017 写道 function getMap(domainId); { var temp; //DWR调一个服务,callback是一个回调函数,实现赋值功能 PubDomainItemDao.getMap(domainId , {callback: function(data);{temp= data;}});; return temp; } var map = getMap("test");; 没有了alert,这时候map也是undefine 呵呵,因为从服务器上取数据总是要花时间的,而你的getMap("test")会立即返回,所以你这样是不可能得到你需要的数据的,你怎么能指望一个简单的付值语句var map = getMap("test")就马上取到数据呢,换种处理方式吧,一定要这么写的话除非你把异步模式设为false |
|
返回顶楼 | |
发表时间:2006-08-10
function getElement(name); { var result = null; var objs = document.getElementsByName(name);; if (objs); { var o = objs[0]; result = o; } return result; } function dwrGoods(num);{ var tempIndex = num; var goodsCode = "goodsCode"+tempIndex; var goodsCodes = getElement(goodsCode);; alert("goodsCodes:" + goodsCodes.value);; if(goodsCodes);{ alert("obj:" + GoodsManager.getGoods(goodsCodes.value););; } } 这是alert提示undefine,真是不知道怎么回事?在java 接口类中GoodsManager.getGoods返回是一个实体对象,请问这里在javascript中如何接收这个对象呢? |
|
返回顶楼 | |
发表时间:2006-08-29
郁闷。。。我也遇到类似的问题。。。。。。。。
|
|
返回顶楼 | |