我在Flash中有这个功能:
public function checkFile(file:String):Boolean{
var b:Boolean;
var responder:Responder = new Responder(function(reply:Boolean):void{
b=reply;
msg("vid_"+file+".flv "+ "exists? " + reply);
setState("ready");
status = "ready";
},
function(res:Object):void{
trace("checkFile call failed");
});
mync.call("checkFile",responder,"vid_"+file);
return b;
}
我可以确认reply
变量为真,但return b
最终为假:
这是我用来调用flash函数的javascript:
function checkFile(){
alert(thisMovie("vidRecorder").checkFile(currentVid));
}
这会打开一个消息框,显示false
,而flash文件会显示true
发生了什么事?如何修复它以使我的函数返回与reply
相同的值?
答案 0 :(得分:1)
这是因为响应程序中的匿名函数是异步执行的。
当您的checkFile()
函数返回时,b
的值仍为false
。最终,您的匿名函数已执行且b
设置为true
...但在这种情况下为时已晚,因为您的checkFile()
函数已返回false
。< / p>
要解决此问题,您可能会考虑以稍微不同的方式执行此操作:
执行匿名函数时,请使用异步响应调用javascript。像这样:
public function checkFile(file:String):void {
var responder:Responder = new Responder(function(reply:Boolean):void{
msg("vid_"+file+".flv "+ "exists? " + reply);
setState("ready");
status = "ready";
ExternalInterface.call('someJavascriptFunction', reply);
},
function(res:Object):void{
trace("checkFile call failed");
});
mync.call("checkFile",responder,"vid_"+file);
// note we no longer return a value here
}
在上面的代码中,我们调用一个新的Javascript函数并为它提供异步操作的结果。