Titanium createHttpClient запускается после других объявлений vars

У меня есть этот код в Titanium, который вызывает файл PHP на сервере, который печатает имя пользователя, соответствующее идентификатору:

var myString;
var request = Titanium.Network.createHTTPClient();
var url = "http://localhost/myPhp.php?id=1";
request.open("GET", url, false);
request.onload = function(){
    var newString = this.responseText;
    Ti.API.info(newString);
    myString = newString;
}

request.send();
Ti.API.info("result " + myString);

Консоль Titanium печатает мне это:

  • результат не определен
  • имя пользователя

Титаниум вроде сначала вызывает код после запроса, а потом сам запрос. Поэтому я не могу изменить значение var с помощью responseText. Как мне это сделать? И почему это происходит?

Извините, если кто-то разместил это здесь раньше, но я не мог придумать ключевые слова для поиска здесь, в StackOverflow.

Заранее спасибо =)


person Carlos Zinato    schedule 27.06.2012    source источник


Ответы (3)


запрос асинхронный, при вызове request.send() он не блокирует выполнение. когда запрос завершается, вызывается обработчик событий onload.

person akonsu    schedule 27.06.2012

Измените свой код на это:

var myString;
var request = Titanium.Network.createHTTPClient();
var url = "http://localhost/myPhp.php?id=1";
request.open("GET", url, false);
request.onload = function(){
    var newString = this.responseText;
    Ti.API.info(newString);
    myString = newString;
    Ti.API.info("result " + myString);
}

request.send();

Просто поместите журнал Ti.API.info("result" + myString) в функцию onload. Функция onload вызывается динамически после получения запроса.

person bad    schedule 17.07.2012
comment
спасибо! Он работает только внутри функции загрузки... понял! - person Carlos Zinato; 24.07.2012
comment
@CarlosHenriqueLustosa без проблем!! :) - person bad; 24.07.2012

Запрос Titanium createHttpClient имеет асинхронный и синхронный режимы.

ваша строка запускает первую строку, которая печатает «undefinde» Ti.API.info («результат» + myString);

и затем приходит ответ, и он печатает имя nameOfUser.

если вы хотите, чтобы ваш код выполнялся встроенным, вам нужно сделать вызов createHttpClient синхронным. для которого вы должны установить параметр createHttpClient

сделайте третий параметр равным true.

request.open("ПОЛУЧИТЬ", url, правда);

теперь нормально пойдет

person SAIR    schedule 30.11.2012