Java Script中如何等待callback返回后继续执行?

每天多一点 发布于 2012/02/21 09:16
阅读 8K+
收藏 0

在XX.html中嵌入一段js脚本

js脚本中包含调用一个异步函数,其callback也包含在这个js中。

在这个js的末尾,调用一个函数A,在A中需要对callback执行的结果进行判断。

但是因为js是单线程而且不能有抢断,所以callback函数总是在函数A结束后才能被调用到,这样就起不到想要的效果。

有什么方法能让callback先返回,而后执行性A?如果在callback中执行A,会出现其他的一些问题,所以想请问有没有其他的方法?

以下是问题补充:

@每天多一点:这个html是为了让一个外部的框架来调用的。函数A是必须要有的。如果A写在callback中,就会使得框架因为第一次执行的时候找不到A而报错。 (2012/02/21 09:43)
加载中
0
Andre.Z
Andre.Z

异步调用,决定了你的callback函数会延迟于A执行。正确的逻辑肯定是在callback里面执行A,不知道callback里面执行A又有什么问题。
既然你都想要callback先返回,再执行A,这个过程和在callback里面调用A,不就是一样的么,你又说会有其它问题,那么,你的想法本来就是矛盾的。
A中对callback的结果做判断,A本质就是回调函数的性质。如果回调里面调用A有问题,只能说明,A还能再划分。

Andre.Z
Andre.Z
@MiloJiang : 千万不要自己把过程搞复杂了
Andre.Z
Andre.Z
@MiloJiang : @MiloJiang : 你这个顺序啊,唉 - - ,既然是框架,那么,里面的页面肯定能控制外面的。顺序分2条,1:框架调用html,直接休息吧。2.html异步请求,获取返回,执行callback,callback里面,操纵框架页面的函数。
每天多一点
每天多一点
理想的顺序如下: 框架 -->调用html --> 调用异步函数 <-- callback(结果) --> 函数A(判断结果正确性,返回) 框架根据函数A的返回结果,进行其他的动作。 如果callback中有A,框架就会认为没有A,所以不正确。如果只有A而没有call
Andre.Z
Andre.Z
@MiloJiang : 只要在后面重新定义一个同样名字的函数A,原来的就被覆盖了,会执行新的函数。如果所有都是你写的,直接修改A吧,逻辑问题。框架第一次找不到A,定义好了会找不到?没叫你在回调里面定义函数啊。
Andre.Z
Andre.Z
@MiloJiang : 返回给外部框架有怎D?回调里面不能返回过去么??js很灵活的。
下一页
0
hmly
hmly

除了用循环或setTimeout来等待callback先执行外,想不到其它方法了

0
duty
duty
我把异步改同步了。。因为我没有异步的需求。你也可以在callback 函数里调用a函数。如沙发所说。
duty
duty
@MiloJiang : xmlHttp.open("post","xxx.asp",true); //传送方式 读取的页面 异步与否
每天多一点
每天多一点
不会ajax, 了解仅限于wiki...
Andre.Z
Andre.Z
@MiloJiang : 异步改同步不就是一个参数么?ajax?
每天多一点
每天多一点
我想做的就是想把异步改成同步,请问你是怎么做的?可否分享一下?
0
每天多一点
每天多一点

引用来自“hmly”的答案

除了用循环或setTimeout来等待callback先执行外,想不到其它方法了

这个不行,即使等待,函数的执行顺也也是先A而后才callback。
0
pyawen
pyawen

如果A写在callback中,就会使得框架因为第一次执行的时候找不到A而报错。

这个判断一下是否有定义A  定义就调用 可以解决这个问题  

不用在 callback中调用的话 可以通过在callback设置一个调用成功的全局变量 然后在最后判断是否初始化这个全局变量   

var callback_flag = false; //  callback  调用成功之后 设置为true

function callback_ready(){ 
		if(callback_ready) {	  
  //调用A方法
		} else {
			setTimeout('callback_ready()',50);
		}
	}
callback_ready();	


0
zhuhuizhan
zhuhuizhan
我也遇到这个问题了,楼主有解决方案了吗
0
zhuhuizhan
zhuhuizhan
方法A内部需要用到方法B,即A{  B (callback:{   对r处理  } )     return r} ,   如果把return r 放到 callback里面,则r的值没有return到A的外面,而是return到了B的外面A的内部 ,怎么把r返回到A外?求解决方案
0
zhuhuizhan
zhuhuizhan
难道必须设置时间等待检测吗
返回顶部
顶部