Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Ожидание ответа от PHP (http://www.flasher.ru/forum/showthread.php?t=132397)

UginL7 11.11.2009 12:19

Ожидание ответа от PHP
 
Тема может и избита, но ответа я так и не нашёл....
Вообщем суть вопроса:
Есть вот такой код из Файл1.as
Код AS3:

var chSendData:connectToDB = new connectToDB(mcErr);
this.chLineAll = chSendData.chData(this.chLine.text+"\n");

Это отрабатывает при нажатии на кнопку и передаётся в РНР, тут проблем нет (и забегая на перёд - есть одновременно, в this.chLineAll ничего не приходит )
вот реализация connectToDB из Файл2.as
Код AS3:

public function chData(chString:String):String
{
          this.strChatLine = "";
          this.urlRequestScript = new URLRequest("http://10.8.98.11/magic.ua/php/chat.php")
          this.urlRequestScript.method = URLRequestMethod.POST;   
          this.urlLoaderData.addEventListener(Event.COMPLETE, sendChatString);
          this.urlVarible.strChat = chString;
          this.urlRequestScript.data = this.urlVarible;
          this.urlLoaderData.dataFormat = URLLoaderDataFormat.TEXT;
          try
          {
                      this.urlLoaderData.load(this.urlRequestScript);
          }
          catch (err:Error)
          {
                    var mcURLErr:errWindow = new errWindow("Ошибки при передаче данных в БД", this.mcErr);
          }
          return this.strChatLine; //Отрабатывает раньше, чем this.strChatLine принимает значение от РНР
}
 
internal function sendChatString(e:Event):void
{
          this.strChatLine = e.target.data;
          var mcURLErr:errWindow = new errWindow(this.strChatLine, this.mcErr);
          this.urlLoaderData.removeEventListener(Event.COMPLETE, sendChatString);
}

Как я понимаю, что просто задача по получению данных уходит в другой поток и отрабатывает уже потом, после того как был отработан return.
Так вот сам вопрос как сделать задержку, что б this.strChatLine принимал значение и только потом отрабатывал return!?

пробовал сделать вот так
Код AS3:

{
....
while(this.strChatLine == "")
{
}
return this.strChatLine;
}

но тогда флешка вылетает по таймауту, и к тому же это не есть хорошо.

dsQuadro 11.11.2009 12:38

ретурн тут никак не отработает... только на листенер окончания загрузки ставить дальнейшие действия...

UginL7 11.11.2009 13:21

Цитата:

Сообщение от dsQuadro (Сообщение 864734)
ретурн тут никак не отработает... только на листенер окончания загрузки ставить дальнейшие действия...

Подскажите пожалуйста, как это сделать.

ramshteks 11.11.2009 13:24

например событием

dsQuadro 11.11.2009 13:59

this.urlLoaderData.contentLoaderInfo.addEventLisener(Event.INIT, initListener)
на листенер нужно сажать код который должен работать после завершения загрузки

Felicast 11.11.2009 15:18

Цитата:

Сообщение от dsQuadro (Сообщение 864768)
this.urlLoaderData.contentLoaderInfo.addEventLisener(Event.INIT, initListener)

чета вы фигню написали. давно ли у нас у URLLoader есть contentLoaderInfo? да и причем тут INIT?

обработчик окончания загрузки у товарища и так есть:
Цитата:

Код AS3:

this.urlLoaderData.addEventListener(Event.COMPLETE, sendChatString);


по теме: такого результата:
Код AS3:

var chSendData:connectToDB = new connectToDB(mcErr);
this.chLineAll = chSendData.chData(this.chLine.text+"\n");

вам не добиться.
можно попробовать так:
Код AS3:

internal function sendChatString(e:Event):void
{
          this.strChatLine = e.target.data;
          var mcURLErr:errWindow = new errWindow(this.strChatLine, this.mcErr);
          this.urlLoaderData.removeEventListener(Event.COMPLETE, sendChatString);
          dispatchEvent(new Event(Event.COMPLETE));
}
 
******************
 
var chSendData:connectToDB = new connectToDB(mcErr);
chSendData.addEventListener(Event.COMPLETE, completeHandler);
 
******************
 
private function completeHandler(event:Event):void
{
          var chSendData:connectToDB = event.target as connectToDB;
          this.chLineAll = chSendData.strChatLine;
}

ps: называйте классы с большой буквы

dsQuadro 11.11.2009 15:35

Цитата:

Сообщение от Felicast (Сообщение 864794)
чета вы фигню написали. давно ли у нас у URLLoader есть contentLoaderInfo? да и причем тут INIT?

извиняюсь... действительно фигню сморозил... думал о другом в это время...

UginL7 11.11.2009 20:00

Спасибо за идеи... Решил задачу сам и немного другим образом... решил передавать 2-а параметра и ничего не возвращать
Код AS3:

var chLine:TextField = new TextField();
.......................
chData(chString:String, chList:TextField):void
{
.......................
            try
          {
                      this.chLine = chList;//добавил
                      this.urlLoaderData.load(this.urlRequestScript);
          }
.......................
}
internal function sendChatString(e:Event):void
{
          this.strChatLine = e.target.data;
          var mcURLErr:errWindow = new errWindow(this.strChatLine, this.mcErr);
          this.chLine.appendText(this.strChatLine); //добавил
          this.urlLoaderData.removeEventListener(Event.COMPLETE, sendChatString);

и при вызове добавил второй параметр - TextField в который надо добавить обработанную строку. Теперь всё работает.

Скажите пожалуйста, это нормальное решение или у него есть глюки?(я их пока не нашёл)

Felicast 11.11.2009 20:27

Цитата:

Скажите пожалуйста, это нормальное решение или у него есть глюки?(я их пока не нашёл)
с точки зрения проектирование - не совсем хорошее (да и мое тоже).
класс работы с бд в идеале ничего не должен знать ни о каких TextField, errWindow. у него запросили данные - он начал грузить, загрузил - сообщил что загрузил. а что там будет с данными делаться ему должно быть по барабану.

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


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

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