Javascript не возвращает данные во флеш-память AS3

Я надеюсь, что кто-нибудь сможет мне помочь. У меня есть следующая функция в FlashBuilder 4 с использованием AS3:

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 и возвращает «некоторый формат запроса» в правильное текстовое поле.

Однако, если я изменю свою функцию вспышки, чтобы она была следующей:

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");
        }
    });    
};

Моя проблема в том, что когда я запускаю этот, он передает идентификатор, запускает запрос и точно возвращает идентификатор и отображает его в предупреждении, НО (И ВОТ МОЯ ПРОБЛЕМА) он не передает его обратно, чтобы мигать Возврат. Каждый раз он возвращается как null или undefined.

Может ли кто-нибудь сказать мне, что мне не хватает. Я уже часами рыскал в гугле.


person Cenapps    schedule 17.07.2012    source источник


Ответы (2)


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 вызвать функцию во флэш-приложении и передать туда возвращаемое значение. Так что в основном выполните 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");
        }
    });    
};
person Barış Uşaklı    schedule 17.07.2012
comment
Спасибо, Барис, но я не уверен, что понимаю. Если я нажимаю кнопку, которая запускает функцию runFQL, она обрабатывает FB.api и каждый раз обязательно выводит предупреждение uid. Это просто возврат, который терпит неудачу. - person Cenapps; 17.07.2012
comment
Хорошо, вот что происходит, когда вызывается функция runFQL, она просматривает операторы и выполняет их один за другим. FB.api выполняет асинхронный вызов, поэтому выполнение продолжается после вызова функции FB.api и завершения функции runFQL, а поскольку в конце runFQL нет оператора возврата, он всегда возвращает undefined. Теперь вы видите предупреждение, потому что, когда fql.query завершен, он вызывает функцию, которую вы передаете в FB.api. Эта функция вызывается после завершения runFQL. - person Barış Uşaklı; 17.07.2012

У вас очень небольшая проблема с рабочим процессом. В вашем коде JavaScript вы вызываете FB api, а затем функция завершается, и в этом случае она вернет undefined, поскольку ничего не возвращается. Но вы думаете, что безымянная функция - это то, что возвращает, хотя на самом деле она еще даже не вызывается, потому что API даже не получил ответа. Что вам нужно сделать, так это изменить следующую строку кода.

return uid;

to

myHTMLFlashObject.someFunctionName(uid);

и в вашем flash-проекте вам нужно добавить функцию someFunctionName и добавить ее как функцию обратного вызова ExternalInterface.
Помните, что API-интерфейсы не являются асинхронными, поэтому вы можете ожидать, что функция runFQL вернет undefined задолго до того, как API отправит ответ.

person The_asMan    schedule 17.07.2012
comment
Спасибо за объяснение. Я смог реализовать то, что мне прислал Барис, и все работает отлично. Я просто не понимал, почему это было так. - person Cenapps; 17.07.2012