【问题标题】:Boolean is true in Flash, but false in Javascript布尔值在 Flash 中为真,但在 Javascript 中为假
【发布时间】:2013-07-25 19:53:31
【问题描述】:

我在 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,而闪存文件显示true

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

【问题讨论】:

  • 这是一个异步操作
  • @Pointy 哦不!这听起来很不祥,特别是因为你把它加粗了。让我查一下。
  • 异步和回调的概念在this thread中有很好的解释。

标签: javascript actionscript-3 flash


【解决方案1】:

这是因为您的响应器中的匿名函数是异步执行的。

当你的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 函数并将异步操作的结果提供给它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-05
    • 2020-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多