Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   чтение из AMF (http://www.flasher.ru/forum/showthread.php?t=136075)

cn_snipes 09.02.2010 14:46

чтение из AMF
 
Доброго времени.
Работаю со связкой MySQL-> AMF(PHP) -> AS3, а имменно:

1. В РНР-файле (" getdata.php ") класс, где описываются методы-SQL-запросы.
2. Класс amf.as - класс, где описан метод доступа к " getdata.php ":
Код AS3:

package {
import flash.net.Responder;
import flash.net.NetConnection;
 
public class Amf {
 private var nc : NetConnection = new NetConnection();  //--
 
 public function Amf(hostname:String) {
  nc.connect(hostname+"/amfphp/gateway.php");  //--коннектимся к серверу и к обработчику amf
  nc.objectEncoding=3; //--метод кодирования
 }
/**
*Выполняет запросы к amfphp
* wht - сервис и имя запрашиваемой функции (дальше в примере покажу)
* cb - функция, вызываемая при получении ответа
* args - аргументы, которые должны передаться запрашиваемой функции от серверного скрипта, указываются через запятую) т.е. может быть хоть один хоть десять.
*/

 public  function toamf(wht:String, cb : Function, ... args) : void {
  var resp : Responder = new Responder(cb, onFault); //--обработчик ответа сервера, если все ок, то вызываем переданную нам  функцию для ответа (cb), если нет, то функцию сообщения об ошибке.
  nc.call.apply(null,[wht,resp].concat(args)); //--немного непонятно, но вкратце: запускаем функции отсылания запроса на сервер, задаем функцию обратного вызова и параметры + функцию при ошибке выполнения.
 } 
 private function onFault(res:Object):void { //--при ошибке выполнения запроса
  trace('К севраку не достучались, ответ: ',res);
 } 
}
}

3. Собственно рабочий AS3 ("amftest.as"):
Код AS3:

package {
import flash.display.MovieClip;
import Amf; //--подключаем наш класс
 
public class Amftest extends MovieClip {
 public function Amftest() {
  var amf:Amf=new Amf("http://myservername.ru");
  amf.toamf("amftest.getnews.getnews", onGetNews);
  /* в " getdata.php " описана функция:
        function getnews() { //--выбираем все новости
          return mysql_query('select * from news');
        }
 */

 }
 
 public function onGetNews(o:Object) {
  trace(o.serverInfo.initialData);
 }
 
}
}

Рабоает идеально. Вопрос с последним, рабочим AS: как воспользоватся полученными данными? Т.е. получить данные в переменную:
Код AS3:

var result:Object;
.....
 public function onGetNews(o:Object) {
  result = o;
 }
.....
trace (result);

и становится очевидно, что result ни капли не изменился, т.к. я его вызываю, а onGetNews ещё не сработал.

udaaff 09.02.2010 15:25

Вы сами же и ответили на свой вопрос:
Цитата:

и становится очевидно, что result ни капли не изменился, т.к. я его вызываю, а onGetNews ещё не сработал.
Ничего не мешает воспользоваться данными в onGetNews... Или вызвать какие-то определенные методы для обработки этих данных там же.

cn_snipes 09.02.2010 18:07

О как бы я хотел ответить на вопрос, курсовая горит ))
Тем не более вопрос остается прежним: как воспользоватся полученными данными?
Думаю тут вопрос не столько в специфике AMF, сколько в опыте вледания AS3 - у меня его мало, вот я его и увеличиваю ).
Хорошо бы было заставить возвращать искомые данные метод amf.toamf("amftest.getnews.getnews", onGetNews), но как? Пробывал по всякому :(

udaaff 09.02.2010 18:13

Цитата:

Тем не более вопрос остается прежним: как воспользоватся полученными данными?
Ну так пользуйтесь. Кто не дает? :)

Цитата:

Хорошо бы было заставить возвращать искомые данные метод amf.toamf("amftest.getnews.getnews", onGetNews), но как? Пробывал по всякому
Код выполняется асинхронно, в данном случае. Невозможно сделать то, что вы хотите.

cn_snipes 09.02.2010 18:40

Цитата:

Сообщение от udaaff (Сообщение 885111)
Невозможно сделать то, что вы хотите.

udaaff вы жестоки :'''(( . Раз так скажите, а нельзя ли как нибудь дождаться значения? Всмысле для AS2 был стандартный механизм для работы с XML :
Код AS1/AS2:

var xml:XML = new XML();
xml.ignoreWhite = true;
xml.onLoad = function(success){
if (!success){
 trace("Не смогли загрузить данные :'(");
 return;
}

есть что нить применимое в этой ситуации?

udaaff 09.02.2010 18:52

Цитата:

Сообщение от cn_snipes (Сообщение 885122)
udaaff вы жестоки :'''(( . Раз так скажите, а нельзя ли как нибудь дождаться значения? Всмысле для AS2 был стандартный механизм для работы с XML :
Код AS1/AS2:

var xml:XML = new XML();
xml.ignoreWhite = true;
xml.onLoad = function(success){
if (!success){
 trace("Не смогли загрузить данные :'(");
 return;
}

есть что нить применимое в этой ситуации?

Этот код работает точно также, как и предыдущий. Здесь не записывается результат выполнения функции (т.к. обработчики событий не возвращают ничего по определению), а записывается ссылка на функцию-обработчик события onLoad, а return используется лишь для остановки выполнения функции.

cn_snipes 09.02.2010 19:20

пасибо. Буду пробывать


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

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