【问题标题】:Javascript not returning data to AS3 flashJavascript 未将数据返回到 AS3 闪存
【发布时间】:2012-07-17 00:25:17
【问题描述】:

我希望有人可以帮助我。我在使用 AS3 的 FlashBuilder 4 中有以下功能:

protected function doIt():void
    {
        if (ExternalInterface.available) {
            var retData:String;
            retData = ExternalInterface.call("returndata");
            if(retData != null) {
                eidLbl.text = retData.toString();
            } else {
                eidLbl.text = "Returned Null";
            }
        } else {
            eidLbl.text = "External Interface not available";
        }                
    }

以及它调用的以下javascript函数:

var fql_query = "some query format";
function returndata(){
    return fql_query;
}

当我从我的网站运行这些时,一切正常! flash 文件调用 javascript 函数并将“某种查询格式”返回到正确的文本字段中。

但是,如果我将 flash 功能更改为如下:

protected function doIt():void
{
    if (ExternalInterface.available) {
        var retData:String;
        retData = ExternalInterface.call("runFQL",uidLbl.text);
        if(retData != null) {
            eidLbl.text = retData.toString();
        } else {
            eidLbl.text = "Returned Null";
        }
    } else {
        eidLbl.text = "External Interface not available";
    }                
}

以及以下javascript函数:

function runFQL(id){
    var user_id = id;
    var page_id = "**********"; // the page id that is actually there is valid
    var fql_query = "SELECT uid FROM page_fan WHERE page_id="+page_id+" and uid="+user_id;

    FB.api({
        method: 'fql.query',
        query: fql_query
    },
    function(response){
        if (response[0]) {
                var uid = response[0].uid;
                window.alert(uid); //100001632043058
                return uid;
        } else {
                window.alert("return 1000");
        }
    });    
};

我的问题是,当我运行这个时,它会传入 id,运行查询,并准确地拉回 uid 并将其显示在警报中但(这是我的问题)它不会将其传回闪回。它每次都返回为 null 或 undefined。

谁能告诉我我错过了什么。我已经在谷歌上搜索了好几个小时了。

【问题讨论】:

    标签: javascript actionscript-3 flash externalinterface


    【解决方案1】:
    function(response){
        if (response[0]) {
            var uid = response[0].uid;
            window.alert(uid); //100001632043058
            return uid;
        } else {
            window.alert("return 1000");
        }
    });
    

    在 FB.api 函数完成时调用,而不是在您调用 runFQL 时调用。所以 runFQL 会遍历一遍,每次都返回 undefined。

    您可以在 FB.api 调用完成后调用 Flash 应用程序内的函数并在那里传递返回值。所以基本上在 Flash 中做一个 ExternalInterface.addCallback 并从 javascript 调用该函数。

    function runFQL(id){
        var user_id = id;
        var page_id = "**********"; // the page id that is actually there is valid
        var fql_query = "SELECT uid FROM page_fan WHERE page_id="+page_id+" and uid="+user_id;
    
        FB.api({
            method: 'fql.query',
            query: fql_query
        },
        function(response){
            if (response[0]) {
                    var uid = response[0].uid;
                    window.alert(uid); //100001632043058
                    // needs ExternalInterface.addCallback("sendDataBack",handleData); in your 
                    // as3 code
                    yourSwf.sendDataBack(uid); 
            } else {
                    window.alert("return 1000");
            }
        });    
    };
    

    【讨论】:

    • 谢谢巴里斯,但我不确定我是否理解。如果我单击一个运行 runFQL 函数的按钮,它会处理 FB.api 并且每次都会触发 uid 的警报,而不会失败。只是返回失败。
    • 好的,这是调用 runFQL 函数时发生的情况,它遍历语句并一一执行。 FB.api 正在进行异步调用,因此在调用 FB.api 函数后继续执行,并且 runFQL 函数结束,并且由于在 runFQL 结束时没有 return 语句,它总是返回 undefined。现在您会看到警报,因为当“fql.query”完成时,它会调用您传递给 FB.api 的函数。该函数在 runFQL 完成后调用。
    【解决方案2】:

    您有一个非常小的工作流程问题。在您的 JavaScript 代码中,您正在调用 FB api,然后函数结束,在这种情况下,它将返回一个未定义的值,因为没有返回任何内容。但是您认为无名函数实际上是在实际上还没有被调用时返回的,因为 API 甚至没有得到响应。 您需要做的是更改以下代码行。

    return uid;
    

    myHTMLFlashObject.someFunctionName(uid);
    

    在您的 Flash 项目中,您需要添加一个函数 someFunctionName 并将其添加为 ExternalInterface 回调函数。
    请记住 API 不是异步的,因此您可以预期函数 runFQL 在 API 发送响应之前很久就返回 undefined。

    【讨论】:

    • 感谢您的解释。我能够实施 Baris 发送给我的内容,并且一切正常。我只是不明白为什么会这样。
    猜你喜欢
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多