Ajax на PhoneGap не вернет значение - PullRequest
0 голосов
/ 07 марта 2012

Это похоже на довольно нубский вопрос, но какого черта.Я сижу с проектом PhoneGap и у меня есть некоторые проблемы.Я следовал учебному пособию для небольшой твиттеровой ленты с ajax (http://wiki.phonegap.com/w/page/42450600/PhoneGap%20Ajax%20Sample)), и она работает как чудо. Но я кодирую небольшой API для входа, выхода из системы и т. Д., И т. Д., И я почти заставил его работать.1003 * Я объясню свою проблему: я установил, например, переменную BOOL, "b", которая определяет, вошел ли пользователь в систему или нет.

var b = Do_Ajax ('isloggedin');

и функция выглядит почти точно так:

    function Do_Ajax(what)
    {
        var ajax = new XMLHttpRequest();

        if(what == "isloggedin")
        {
            ajax.open("GET", root() + "/?isloggedin",true);
            ajax.send();
        }

        //Get the results back           
        ajax.onreadystatechange=function()
        {
            if(ajax.readyState==4 && (ajax.status==200||ajax.status==0))
            {
                eval('var data = ' + ajax.responseText + ';');
                var theResults = data.results;                    
                if(data['BOOL'] != null )
                {
                    return data['BOOL']; 
                }
            }
        }
    }

Если я сейчас попробую предупредить об этой переменной (b), я получу "неопределенное". Если я изменю "возврат" на "alert "(где я печатаю" return data ['BOOL']; "- php возвращает строку json) я получу значение true или false. Если у меня тогда будет предупреждение о переменной b И в функции - bСначала переменная оповещает, а затем данные ['BOOL'] предупреждают.

Таким образом, проблема в том, что функция возвращает неопределенное значение, прежде чем получает данные. Как я могу заставить функцию "ждать", чтобы вернуть это значение, пока онозапустил этот материал onreadystatechange?

РЕДАКТИРОВАТЬ: Один из способов решитьЭто значит, что нужно объявить переменную вне функции, например, "var IsUserOnline = false;", а затем в функции, когда запрос выполнит, установить "IsUserOnline = data ['BOOL']:", а затем в коде просто использовать эту переменную.,Но нет, я думаю, что возвращение было бы лучше.Я думаю, что мой код будет очень грязным в будущем, когда я получу / опубликую больше материала через эту функцию.Может быть, это просто мое мнение, что сейчас действительно неправильно?

Ответы [ 2 ]

1 голос
/ 07 марта 2012

Вы можете вызвать функцию в функции onreadystatechange.

В вашем коде (см. Мой добавленный комментарий):

function Do_Ajax(what)
    {
        var ajax = new XMLHttpRequest();

    //Get the results back           
    ajax.onreadystatechange=function()
    {
        if(ajax.readyState==4 && (ajax.status==200||ajax.status==0))
        {
            eval('var data = ' + ajax.responseText + ';');
            var theResults = data.results;                    
            if(data['BOOL'] != null )
            {
                return data['BOOL']; 
            }

            //CALL YOUR FUNCTION HERE, 
            //OR THE CODE WHAT NEEDS TO HAPPEN AFTER A VALUE HAS BEEN RECEIVED 
            //BY THE AJAX REQUEST
        }
    }

    if(what == "isloggedin")
    {
        ajax.open("GET", root() + "/?isloggedin",true);
        ajax.send();
    }
}
0 голосов
/ 07 марта 2012

Если я правильно понял, вы пытаетесь вызвать синхронный вызов ajax, но данная функция все еще использует асинхронный способ, поэтому вы не получите правильные данные. Попробуйте функцию обещания jQuery AJAX, которая поможет вам вызвать ajax-запрос по синхронному шаблону.

http://www.erichynds.com/jquery/using-deferreds-in-jquery/

http://intridea.com/posts/fun-with-jquery-deferred

Если вы не используете jQuery, вам может потребоваться добавить параметр callback после what и вызвать обратный вызов при обработке ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...