PDA

Просмотр полной версии : sendAndLoad, как синхронизировать onData и return в классе?


fortman
17.11.2008, 02:43
Есть класс.
class classes.Company{

public var send_obj:LoadVars=null;
public var rec_obj:LoadVars=null;
public static var companyXML:XML = null;

public function Company(){
send_obj = new LoadVars();
rec_obj = new LoadVars();

rec_obj.onData=function(text:String) {
companyXML = new XML(text);
}
}

public function viewAll():XML{
send_obj.select="select * from Company";
send_obj.pass="";
send_obj.sendAndLoad("xml.php", rec_obj, "GET");
return companyXML;
}
}
Есть другой класс, в котором создается объект этого и вызывается viewAll. Не удивительно, что в приведенном примере возвращается null. Но как сделать, что бы значение отправлялось методом viewAll после срабатывания onData? Чего я только не пробовал, и while, и setInterval, и watch... В прогерстве в стиле AS2 я новичок, всё бомбил AS1, возможно просто чего-то не знаю. Подскажите, как решить вышеописанную проблему?

Mnilionic
17.11.2008, 02:58
надо onLoad вместо onData.
return тут не катит.
Вернуть ваш метод может true, к примеру :) - типа запрос отправлен ждите ответа.
А при сровабывании события onLoad нужно запускать функцию, которая будет обрабатывать ответ. Так как у вас, как я понял, несколько потомков класса, то callback функцию можно передавать как параметр метода viewAll

+
send_obj.select="select * from Company";
плохая идея!

fortman
17.11.2008, 03:18
Почему надо onLoad и почему плохая идея с запросом не понял?

Класс, вызывающий viewAll
class classes.ViewInfo{
public var company:classes.Company = null;
public var xml:XML = null;

public function viewCompany(){
company = new classes.Company();
xml = company.viewAll();

}
}

Как и что надо поправить тут?

Mur4ik
17.11.2008, 05:31
Примерно вот так, но код не тестировался, поэтому возможны глюки, но смысл уловить можно ;)

import mx.utils.Delegate;

class classes.ViewInfo
{
public var company:classes.Company = null;

public function ViewInfo():Void
{
company = new classes.Company();
company.viewAll();
company.onDataOK = Delegate.create(this, dataReady);
}

public function dataReady(companyXML:XML){
trace("companyXML: " + companyXML);
}
}

import mx.utils.Delegate;

class classes.Company
{
public var send_obj:LoadVars=null;
public var rec_obj:LoadVars=null;
public var companyXML:XML = null;

public var onDataOK:Function;

public function viewAll():Void
{
send_obj = new LoadVars();
rec_obj = new LoadVars();

send_obj.select="select * from Company";
send_obj.pass="";
rec_obj.onData = Delegate.create(this, onFinish);
send_obj.sendAndLoad("xml.php", rec_obj, "GET");
}

public function onFinish(sData:String):Void
{
companyXML = new XML;
companyXML.parseXML(sData);
companyXML.ignoreWhite = true;
onDataOK(companyXML);
}
}

теперь если создать экземпляр класса ViewInfo (getXML:classes.ViewInfo = new classes.ViewInfo()), то в трейсе выведется полученный XML.

Еще одно решение - задействовать класс mx.events.EventDispatcher, с помощью которого класс classes.Company будет генерировать событие о получении данных, в классе classes.ViewInfo организовать подписку на это событие, мой пример работает по примерно похожей схеме, но немного проще :)