Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Обработка события Event.COMPLETE в классе URLLoader() (http://www.flasher.ru/forum/showthread.php?t=143333)

deceiver 13.08.2010 17:08

Обработка события Event.COMPLETE в классе URLLoader()
 
"Зашился" с такой дилеммой:
есть экземпляр класса loader:URLLoader(), с его помощью происходит загрузка запроса к таблице в базе данных мускул через пхп-файлик, запрос передавается в качестве параметра URLRequest(var). Он представляет собой выборку значений из базы. Получение значения происходит следующим образом:

создается слушатель события Event.COMPLETE, функция, указанная в котором, запускается соответственно уже после окончания загрузки. В функции обрабатывается значение loader.data, в котором хранится результат выборки. Значение обрабатывается корректно, все чики-пики. Но факт в том, что после того, как приходит черед выполнения функции, указанной в слушателе этого события, никакие действия, указанные после момента получения выборки, уже не выполняются, как-то прорисовка Sprite'ов, кнопок, текстовых полей и т.д. Как же сделать какие-то действия после получения значения из базы? В зависимости от него что-то будет или не будет происходить.

Плз, помогите советом, два дня уже колупаюсь.. :wacko:

e_gamer 13.08.2010 17:19

Что говорит trace() результата запроса?

deceiver 16.08.2010 13:44

trace() работает корректно, он отображает результат запроса query() из базы. Суть в том, что в тот момент, когда происходит обращение к результату выборки в функции слушателя, в коде не удается произвести никакие действия. Я попытался попробовать использовать другие события, кроме Event.COMPLETE, но на них функция не реагирует вообще. Я что-то не так делаю? подскажите, плиз..

-De- 16.08.2010 13:53

Если вы не пытаетесь использовать ответ от сервера до Event.COMPLETE, то явно где-то возникает исключение. Странно, что его вам под нос не суют (дебаговый плеер(?)). Ну можно например найти строку, в которой trace уже не работает и искать проблемы в строке выше, 99 к 1, что что-то там есть, типа обращения по нулевому указателю.

deceiver 16.08.2010 14:12

То есть это может быть проблема в плеере? Все функции, которые выполняют действия, запускаются до ф-ции, ассоциированной с Event.COMPLETE, а trace() отлавливается только в слушателе, никак не раньше

-De- 16.08.2010 16:55

Почти нереально, чтоб из-за проблем в плеере что-то не отрисовывалось итп., просто если поставить дебаговый, то может больше расскажет про ошибки.

deceiver 17.08.2010 11:05

Так как поступить в данной ситуации оптимальным образом? Можете подсказать? Возможно, это корректное поведение приложения, и после выполнения события Event.COMPLETE ни одно действие не выполняется в коде, и необходимо или другое событие, или обработка исключения, если это некорректное поведение? Однако, в случае, если происходит исключение, то доступ к результату выборки возможно и не способен быть получен до наступления этого события? Тогда для реализации данной функциональности необходимо прибегнуть к использованию других классов и подхода, в частности сокетов, а не URLLoader()?
Дебаг-версия: вот тут? http://download.macromedia.com/pub/f...ugin_debug.exe

-De- 17.08.2010 11:37

Найти ошибку. Что тут думать - трясти надо. После Event.COMPLETE всё работает как и до.
Кабы минимальный код на котором воспроизводится дали (с краткими пояснениями, чего хотим и чего происходит), то во-первых в процессе его получения хороший шанс, что поняли бы, в чем дело, а во-вторых можно было бы помочь. Ещё (как по мне) можно изьясняться попроще и пояснее, т.к. что конкретно значит "после того, как приходит черед выполнения функции, указанной в слушателе этого события" я не понял.
Дебаг плеер там, да. Но это для браузера. Ещё неплохо бы попробовать в http://download.macromedia.com/pub/f...ayer_10_sa.exe запустить.

deceiver 17.08.2010 16:45

Обнаружилось частично, почему не запускается код.
Здесь привожу фрагмент из приложения:
Код AS3:

var variables:URLVariables = new URLVariables();                
variables.qu = "SELECT max( game_id ) FROM game WHERE game_completed = 0";                         
var request:URLRequest = new URLRequest("http://localhost/tests/criss-cross/databaseconnect.php");
request.data = variables;
request.method = URLRequestMethod.POST;
loader = new URLLoader();
loader.addEventListener(Event.COMPLETE, startListener);
loader.load(request);
 
public function startListener (e:Event):void {
trace(loader.data);
//Тестовое поле
var t:TextField = new TextField();
t.autoSize  = TextFieldAutoSize.LEFT;
t.border    = true;
t.background = false;
t.selectable = false;
t.text = "ola";
t.y = 300;
addChild(t);
var query_res:Number = loader.data;
trace(query_res);

В случае, если код физически находится в главном as-файле приложения, все работает на "ура", создается текстфилд, переменные типа URLVariables, URLRequest видны на вкладке Переменные в режиме дебаггинга, значения также.

Но, чтобы не засорять главный файл, я решил вынести этот фрагмент в другой класс сугубо для составления запроса и подключения к базе. И вот тогда loader.data отображается корректно, но поле не создается при прохождении через ф-цию startlistener. Как это работает, а точнее не :):
Код AS3:

public class Connector extends Sprite {
--- описание переменных ---
  public function Connector(queryText: String) {
    setURL(queryText);
  }
  public function setURL(variableText:String):void {
    var variables:URLVariables = new URLVariables();               
    variables.qu = variableText;
  --- тот же самый код ---
  }
}

startListener находится в этом же вторичном файле.
Может быть, подключение к URLLoader'у нельзя "разносить" по отдельным сущностям? Пробовал без передачи в конструктор, а сразу в ф-цию: аналогично. В версии плеера для десктопа - то же.

-De- 17.08.2010 17:06

Даже подключение к мыше можно вынести в астрал (я сам не пробовал).
Возможно дело в том, что addChild(t); в главном классе добавляет к руту, а в коннекторе к коннектору, который, похоже, не добавлен в дисплей лист ("к руту") и вообще не понятно почему от спрайта унаследован.
Больше гадать без того, что можно скопировать и скомпилировать не буду.
И это, надеюсь про sql иньекции в курсе, а то уже руки чешутся написать variables.qu = "drop table game";


Часовой пояс GMT +4, время: 21:18.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.