1

誰かが私を助けてくれることを願っています。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;
}

これらを自分のサイトから実行すると、すべて正常に動作します! フラッシュ ファイルは JavaScript 関数を呼び出し、適切なテキスト フィールドに「何らかのクエリ形式」を返します。

ただし、フラッシュ機能を次のように変更すると:

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 として返されます。

私が欠けているものを誰か教えてください。私は何時間もグーグルを精査してきました。

4

2 に答える 2

0

非常に小さなワークフローの問題があります。JavaScriptコードでFBapiを呼び出していると、関数が終了します。この場合、何も返されないため、未定義が返されます。しかし、APIが応答を受け取らなかったために、実際にはまだ呼び出されていない場合でも、無名関数が返されると考えています。次のコード行を変更する必要があります。

return uid;

myHTMLFlashObject.someFunctionName(uid);

someFunctionNameフラッシュプロジェクトでは、関数を追加し、ExternalInterfaceコールバック関数として 追加する必要があります。
APIは非同期ではないため、APIが応答を送信するずっと前に関数runFQLが未定義を返すことが期待できます。

于 2012-07-17T05:13:39.417 に答える
0
function(response){
    if (response[0]) {
        var uid = response[0].uid;
        window.alert(uid); //100001632043058
        return uid;
    } else {
        window.alert("return 1000");
    }
});

runFQL を呼び出したときではなく、FB.api 関数が完了したときに呼び出されます。したがって、runFQL は実行され、毎回 undefined を返します。

できることは、FB.api 呼び出しが完了したら、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");
        }
    });    
};
于 2012-07-17T00:28:02.370 に答える