2012-03-07 3 views
0

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

Я объясню свою проблему: Я установил, например, переменную 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']; 
       } 
      } 
     } 
    } 

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

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

EDIT: Один из способов решения этой задачи - объявить переменную вне функции, например "var IsUserOnline = false;" а затем в функции, когда запрос, который он выполнил, установил «IsUserOnline = data ['BOOL]:», а позже в коде просто используйте эту переменную. Но нет, я думаю, что лучше всего подумать о возвращении. Я думаю, что мой код будет очень грязным в будущем, когда я получу/отправлю больше материала с помощью этой функции. Может быть, это просто мое мнение, что сейчас действительно неправильно?

ответ

1

Вы можете вызвать функцию в функции 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

Эй, спасибо за репил. Но какую функцию я должен назвать? Назовите себя? Я хочу, чтобы после запроса было, что Do_Ajax должен вернуть значение [BOOL]. Сейчас он просто возвращает undefined, так как он возвращает значение перед запуском файла onreadystatechange. – Linus

+0

Я думаю, вы должны назвать другую функцию. Вы инициализируете запрос ajax, а в onreadystate вы помещаете код, который хотите запустить, когда у вас есть результат ajax. - Вы также можете попытаться поместить часть «if (logged_in)» после onreadystatechange. – Jozzeh

+1

См. Мой отредактированный ответ (заменил «if-isloggedin» – Jozzeh

0

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

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

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

Если вы не используете JQuery, то вам может понадобиться добавить параметр callback после what и вызвать функцию обратного вызова по обработке ответа.

+0

Привет и спасибо за ответ. Можете ли вы показать мне пример обратного вызова? – Linus

+0

Я привел пример в этой скрипке http://jsfiddle.net/dhavaln/6QkWg / – dhaval

Смежные вопросы