Boolean在Flash中为true,但在Javascript中为false

Boolean在Flash中为true,但在Javascript中为false,javascript,actionscript-3,flash,Javascript,Actionscript 3,Flash,我在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

我在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
变量为true,但
返回b
结果为false:

这是我用来调用flash函数的javascript:

function checkFile(){
   alert(thisMovie("vidRecorder").checkFile(currentVid));           
}
这将打开一个消息框,显示
false
,而flash文件显示
true


发生什么事了?如何修复它,使我的函数返回与
reply
相同的值?

这是因为响应程序中的匿名函数是异步执行的

当您的
checkFile()
函数返回
b
的值时,仍然是
false
。最终,您的匿名函数被执行,
b
被设置为
true
。。。但在本例中为时已晚,因为您的
checkFile()
函数已返回
false

为了解决这个问题,你可以考虑做一个稍微不同的方式:

当您的匿名函数被执行时,让它通过异步响应调用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函数,并将异步操作的结果提供给它。

发生的是一个异步操作operation@Pointy哦,不!这听起来不祥,尤其是你用粗体字写的。让我查一下。异步和回调的概念在中有很好的解释。