PDA

Просмотр полной версии : Ожидание ответа от PHP


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

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

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

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!?

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

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

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

dsQuadro
11.11.2009, 12:38
ретурн тут никак не отработает... только на листенер окончания загрузки ставить дальнейшие действия...

UginL7
11.11.2009, 13:21
ретурн тут никак не отработает... только на листенер окончания загрузки ставить дальнейшие действия...
Подскажите пожалуйста, как это сделать.

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
this.urlLoaderData.contentLoaderInfo.addEventLisener(Event.INIT, initListener)

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

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


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



по теме: такого результата:
var chSendData:connectToDB = new connectToDB(mcErr);
this.chLineAll = chSendData.chData(this.chLine.text+"\n");
вам не добиться.
можно попробовать так:

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
чета вы фигню написали. давно ли у нас у URLLoader есть contentLoaderInfo? да и причем тут INIT?


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

UginL7
11.11.2009, 20:00
Спасибо за идеи... Решил задачу сам и немного другим образом... решил передавать 2-а параметра и ничего не возвращать

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. у него запросили данные - он начал грузить, загрузил - сообщил что загрузил. а что там будет с данными делаться ему должно быть по барабану.

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