日期:2014-05-16  浏览次数:20357 次

DWR给javascript变量赋值的问题
采用DWR获取java程序的值,然后我要用获取的值给javascript变量赋值,但是很郁闷,居然要先执行alert语句才能正确显示赋值的结果,如果javascript代码如下:(其中remote.isRepeat是调用java类)
					var repeatFlag = 0;
remote.isRepeat("hell", function(msg) {
if (msg > 0) {
repeatFlag = 1;
}
});
alert("hahaha!");
alert(repeatFlag);

那么alert(repeatFlag)的时候就能得到赋值后的正确结果1而不是原始的0
但是如果吧前面的那一句alert("hahaha!");去掉,则alert(repeatFlag)的结果就是原始0,根本没有被赋值(当然赋值的条件是肯定满足的情况下)

查阅了一下网上资料,都说是DWR同步和异步的问题,要加上dwr.engine.setAsync(false);,但我没看懂,http://blog.csdn.net/zxkevin1989/article/details/7282315 这里就有提到,请问就我如下的代码而言,问题究竟出在哪里呢?

------解决方案--------------------
本帖最后由 showbo 于 2013-07-23 22:25:59 编辑
不了解dwr,js无刷新调用动态页一般通过异步ajax来实现,相比dwr也是这样

于是没有执行下面红色的回调函数设置repeatFlag时都已经执行到绿色的那句了,由于加了alert("hahaha!"),ajax不会被挂起,所以继续执行了红色回调设置了变量的值,点击确定后就是回调设置过的值了

设置为同步的话,执行remote.isRepeat这个后就回挂起所有代码执行,并且在执行了红色的回调函数后再执行绿色的语句,这样就得到正确的值了

var repeatFlag = 0;
remote.isRepeat("hell", function(msg) {
    if (msg > 0) {
        repeatFlag = 1;
    }
}
);
alert("hahaha!");
alert(repeatFlag);
------解决方案--------------------
加上这一句即可 dwr.engine.setAsync(false);

具体如下
dwr.engine.setAsync(false);//加上这句之后,alert("hahaha!");那句可以去掉了,可正常赋值成功,否则没这句的话非要加上alert("hahaha!");才能让repeatFlag = 1;赋值成功
var repeatFlag = 0;
remote.isRepeat("hell",
function(msg) {
    if (msg > 0) {
        repeatFlag = 1;
    }
});
//alert("hahaha!");//现在这句可以去掉了!
alert(repeatFlag);

------解决方案--------------------
function(msg) {
    if (msg > 0) {
        repeatFlag = 1;
    }
}

回调函数中去处理