Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 21.01.2011, 20:57
johny71 вне форума Посмотреть профиль Отправить личное сообщение для johny71 Найти все сообщения от johny71
  № 1  
Ответить с цитированием
johny71

Регистрация: Jan 2011
Сообщений: 5
По умолчанию ожидание записи результата в переменную

Код AS3:
package  {
	import flash.events.Event;
	import flash.net.*;
 
	public class Question {
		public var id:uint;
		public var authorId:uint;
 
		private function setQuestionInfo(e:Event){
			var questionXML:XML = new XML(e.target.data.result);
			var question:XMLList = new XMLList(questionXML);
			this.id = question.question[0].@id;
			this.authorId = question.question[0].author;
		}
 
		private function getQuestionInfo(id:uint, onSuccess:Function){
			var request:URLRequest = new URLRequest();
			request.url = "XXXXXXXXX";
			request.method = URLRequestMethod.POST;
			request.data = new URLVariables("do=getQuestion&id=" + id);
			var loader:URLLoader = new URLLoader();
			loader.dataFormat = URLLoaderDataFormat.VARIABLES;
 
			if(onSuccess == null)
				onSuccess = function() {};
 
			loader.addEventListener(Event.COMPLETE, onSuccess);
			loader.load(request);	
		}
 
		public function Question(id:uint) {
			getQuestionInfo(id, setQuestionInfo);			
		}
	}
}
во фрейме пишу

Код AS3:
var q:Question = new Question(1);
trace(q.id);
получаю на выходе трейса 0, хотя должна быть единица.
если же в функции setQuestionInfo прописать trace(this.id) то все ОК.
как я понимаю результат просто не успевает записаться в переменную id.

как это исправить? поставить какую-нибудь ожидалку?

Старый 21.01.2011, 21:33
JackFromChaos вне форума Посмотреть профиль Отправить личное сообщение для JackFromChaos Найти все сообщения от JackFromChaos
  № 2  
Ответить с цитированием
JackFromChaos
 
Аватар для JackFromChaos

блогер
Регистрация: Jan 2008
Адрес: Донецк
Сообщений: 162
Записей в блоге: 2
Отправить сообщение для JackFromChaos с помощью Skype™
Как думаете, почему URLLoaderDataFormat сразу не возвращает результат, а отсылает событие onSuccess? Что бы программистам жизнь медом не казалась?

Да, не успевает, да, нужна "ожидалка" Точнее надо сделать либо событие, которое посылает Question по завершению запроса. Либо callback(указатель на функцию).
__________________
Искренне Ваш, Джек.

Старый 21.01.2011, 22:16
johny71 вне форума Посмотреть профиль Отправить личное сообщение для johny71 Найти все сообщения от johny71
  № 3  
Ответить с цитированием
johny71

Регистрация: Jan 2011
Сообщений: 5
добавил функцию обработчик. получилось так

Код AS3:
package  {
	import UserInfo;
	import flash.events.Event;
	import flash.net.*;
 
	public class Question {
		public var id:uint;
		public var authorId:uint;
 
		public var successLoadingFunction:Function;
 
		private function setQuestionInfo(e:Event){
			var questionXML:XML = new XML(e.target.data.result);
			var question:XMLList = new XMLList(questionXML);
			this.id = question.question[0].@id;
			this.authorId = question.question[0].author;
			successLoadingFunction(e);
		}
 
		private function getQuestionInfo(id:uint, onSuccess:Function){
			var request:URLRequest = new URLRequest();
			request.url = "ххххххххххх";
			request.method = URLRequestMethod.POST;
			request.data = new URLVariables("do=getQuestion&id=" + id);
			var loader:URLLoader = new URLLoader();
			loader.dataFormat = URLLoaderDataFormat.VARIABLES;
 
			if(onSuccess == null)
				onSuccess = function() {};
 
			loader.addEventListener(Event.COMPLETE, onSuccess);
			loader.load(request);	
		}
 
		public function Question(id:uint, onSuccess:Function) {
			this.successLoadingFunction = onSuccess;
			getQuestionInfo(id, setQuestionInfo);
		}
	}
}
Код AS3:
var q:Question = new Question(1, b);
trace(q.id);
 
function b(e:Event){
	trace(q.id);
	trace(q.authorId);
}
все работает отлично, но хотелось бы узнать не слишком ли это г**нокодно? =)

Старый 21.01.2011, 22:41
JackFromChaos вне форума Посмотреть профиль Отправить личное сообщение для JackFromChaos Найти все сообщения от JackFromChaos
  № 4  
Ответить с цитированием
JackFromChaos
 
Аватар для JackFromChaos

блогер
Регистрация: Jan 2008
Адрес: Донецк
Сообщений: 162
Записей в блоге: 2
Отправить сообщение для JackFromChaos с помощью Skype™
Нормальный код, ИМХО.
__________________
Искренне Ваш, Джек.

Старый 21.01.2011, 22:52
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 5  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,601
Записей в блоге: 17
Лучше событием, но так с пивом потянет.

Старый 21.01.2011, 22:56
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 6  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Цитата:
Сообщение от johny71 Посмотреть сообщение
все работает отлично, но хотелось бы узнать не слишком ли это г**нокодно? =)
Не слишком, но лучше все таки поправить. В вашем варианте будет плодиться пустая функция, если не передавать колбэк для Question.
Код AS3:
package  {
	import UserInfo;
	import flash.events.Event;
	import flash.net.*;
 
	public class Question {
		public var id:uint;
		public var authorId:uint;
 
		public var callBack:Function;
 
		private function setQuestionInfo(e:Event){
			var questionXML:XML = new XML(e.target.data.result);
			var question:XMLList = new XMLList(questionXML);
			this.id = question.question[0].@id;
			this.authorId = question.question[0].author;
			successLoadingFunction(e);
		}
 
		private function getQuestionInfo(id:uint, onSuccess:Function){
			var request:URLRequest = new URLRequest();
			request.url = "ххххххххххх";
			request.method = URLRequestMethod.POST;
			request.data = new URLVariables("do=getQuestion&id=" + id);
			var loader:URLLoader = new URLLoader();
			loader.dataFormat = URLLoaderDataFormat.VARIABLES;
 
			loader.addEventListener(Event.COMPLETE, onSuccess);
			loader.load(request);
		}
 
		public function Question(id:uint, callBack:Function) {
			this.callBack = callBack;
			getQuestionInfo(id, setQuestionInfo);
		}
 
		private function onSuccess(event:Event) {
			if (callBack != null)
				callBack.call();
		}
	}
}
Код AS3:
var q:Question = new Question(1, b);
trace(q.id);
 
private function b():void
{
	trace(q.id);
	trace(q.authorId);
}

Старый 21.01.2011, 22:58
JackFromChaos вне форума Посмотреть профиль Отправить личное сообщение для JackFromChaos Найти все сообщения от JackFromChaos
  № 7  
Ответить с цитированием
JackFromChaos
 
Аватар для JackFromChaos

блогер
Регистрация: Jan 2008
Адрес: Донецк
Сообщений: 162
Записей в блоге: 2
Отправить сообщение для JackFromChaos с помощью Skype™
Цитата:
Сообщение от Psycho Tiger Посмотреть сообщение
Лучше событием, но так с пивом потянет.
Дело вкуса... По мне так, в подобных местах, как раз удобнее функциями пользоваться... Да и кода поменьше... Мы ведь в твинах события не используем почему то?
__________________
Искренне Ваш, Джек.

Старый 21.01.2011, 23:01
johny71 вне форума Посмотреть профиль Отправить личное сообщение для johny71 Найти все сообщения от johny71
  № 8  
Ответить с цитированием
johny71

Регистрация: Jan 2011
Сообщений: 5
всем спасибо за ответы

Создать новую тему Ответ Часовой пояс GMT +4, время: 16:07.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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