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

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

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

Регистрация: Feb 2001
Сообщений: 33
По умолчанию последовательность обращений к серверу с callback. Как красивее сделать?

Задача - нужно произвести последовательное обращение к одному или нескольким серверам, при каждом новом вызове использовать данные полученные от предыдущего.

Сейчас я юзаю калбеки вот так

Код AS3:
function step1( onSuccess:Function,onFailed:Function):void{
...
       if (isOk){
              onSuccess(someData1);
       }else {
              onFailed();
       }
}
 
function step2( onSuccess:Function,onFailed:Function):void{
...
       if (isOk){
              onSuccess(someData2);
       }else {
              onFailed();
       }
}
 
function step3( onSuccess:Function,onFailed:Function):void{
...
       if (isOk){
              onSuccess(someData3);
       }else {
              onFailed();
       }
}
 
//--------
step1(
       function(someData1:SomeType1):void{
       // ok step1
       ...
       step2(
              function(someData2:SomeType2):void{
              // ok step2
              ...
              step3(
                     function(someData3:SomeType3):void{
                     // ok step3
                     ...
                     ///  и пошло дальше
                     }
                     ,
                     function():void{
                     // error step3
                     }
              );
 
              }
              ,
              function():void{
              // error step2
              }
              );
       }
       ,
       function():void{
       // error step1
       }
       );
 
}
Что не нравится: в основном то что явно не понятно из описания функций step1,2,3 какие параметры и сколько будет принимать onSuccess.
Если делать это через события то нагромождение кода будет еще больше, а однозначности все равно не будет, так как не известно однозначно на какое событие надо подписываться.

Известны ли кому-то более однозначные решения этой задачи? Или хотя бы более элегантные ? Тоесть чтобы можно было написать это все не читая комментарии к step1,2,3 и не разбирая их код.

Спасибо


Последний раз редактировалось Troglodit; 22.05.2010 в 13:51.
Старый 22.05.2010, 16:30
enepx вне форума Посмотреть профиль Отправить личное сообщение для enepx Посетить домашнюю страницу enepx Найти все сообщения от enepx
  № 2  
Ответить с цитированием
enepx
 
Аватар для enepx

Регистрация: Aug 2006
Адрес: Мюнхен
Сообщений: 509
Отправить сообщение для enepx с помощью ICQ Отправить сообщение для enepx с помощью Yahoo Отправить сообщение для enepx с помощью Skype™
Почему бы Вам не сделать какой-нибудь массив-очередь и опрашивать сервер последовательно следуя этой очереди? По получении каждого callback'а проверять остались ли еще незагруженные элементы в очереди. Количество загруженных или оставшихся можно сделать отдельной переменной.
Дерзайте.

Старый 22.05.2010, 20:32
Troglodit вне форума Посмотреть профиль Отправить личное сообщение для Troglodit Найти все сообщения от Troglodit
  № 3  
Ответить с цитированием
Troglodit

Регистрация: Feb 2001
Сообщений: 33
Поставить в очередь - запросто. Но ведь беда не в том что я не могу поставить в очередь а в том что явно не понятно из описания функций step1,2,3 какие параметры и сколько будет принимать onSuccess, а очередь тут не помогает

Добавлено через 41 час 0 минут
Кто нибудь?

Старый 24.05.2010, 13:44
enepx вне форума Посмотреть профиль Отправить личное сообщение для enepx Посетить домашнюю страницу enepx Найти все сообщения от enepx
  № 4  
Ответить с цитированием
enepx
 
Аватар для enepx

Регистрация: Aug 2006
Адрес: Мюнхен
Сообщений: 509
Отправить сообщение для enepx с помощью ICQ Отправить сообщение для enepx с помощью Yahoo Отправить сообщение для enepx с помощью Skype™
Я думаю надо как-то стандартизировать параметры или где-то описать их отдельно, если привести к общему знаменателю никак.

Старый 24.05.2010, 15:17
Troglodit вне форума Посмотреть профиль Отправить личное сообщение для Troglodit Найти все сообщения от Troglodit
  № 5  
Ответить с цитированием
Troglodit

Регистрация: Feb 2001
Сообщений: 33
Ну тоесть на уровне компиляции это проверить никак не возможно? Вот в шарпе там делегаты описываются со всеми параметрами и если что-то не совпадает в вызове - сразу ошибка еще на этапе компиляции

что приходит тут на ум - это понасоздавать классов - хранителей функций и параметров, типа Function_Int_String_String его параметры забивать в конструкторе. И тогда function
Код AS3:
step1( onSuccess:Function_Int_String_String,onFailed:Function_Boolean):void;
Но это настолько через одно место что нет слов. Кроме того так надо будет постоянно создавать новые классы если надо будет передать какойто класс в такую цункцию, или ппросто новую комбинацию.

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

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Можно сделать примерно так:
Код AS3:
public function onSuccess(...args):void {
	// ну а тут уже решаем, что к нам пришло
	switch(args.length) {
		...
	}
}
__________________
...вселенская грусть


Последний раз редактировалось iNils; 24.05.2010 в 15:29.
Старый 24.05.2010, 15:49
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 7  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
Нормально при компиляции проверить, что переданная функция принимает такие-то параметры - никак, ибо тип Function вот такая простая вещь. Я лично этому рад.
Можно передавать не функцию, а айдишник, делать switch по айдишнику и в нем писать имя private метода. Будет что надо, но switch я лично не люблю.
Можно поставить в функции проверку на тип аргументов и помирать с криками, если не те, но рантайм будет, да.
Но так ли нужна проверка при компиляции на тип данных? Это если там куча народу этот код пишет, то может есть смысл.
И это, врачи сильно рекомендуют не создавать динамически функции. Т.е. в любом случае рекомендую сделать.
Код AS3:
private function okStep1(someData1:SomeType1):void{
и уже okStep1 передавать.

Старый 24.05.2010, 16:57
Troglodit вне форума Посмотреть профиль Отправить личное сообщение для Troglodit Найти все сообщения от Troglodit
  № 8  
Ответить с цитированием
Troglodit

Регистрация: Feb 2001
Сообщений: 33
свитч не катит тк тормозить будет если широко внедрить все это. Да народу юзает много этот код, так что хочется сделать попонятнее.

динамические функции всмысле анонимные? Не рекомендуют потому что утечки быть могут? не будут если грамотно все сделать. Кстати в методы класса выносить не обязательно чтобы ф-я перестала быть анонимом, можно просто создать ее именованную внути метода где она нужна. Если же выносить в методы то это ужасно раздует интерфейс

Цитата:
Можно поставить в функции проверку на тип аргументов и помирать с криками, если не те, но рантайм будет, да.
этого я не понял. внути какой ф-и? onSuccess? Если да то до этой проверки выполнение вообще не придет если передать в ф-ю не тот параметр, а ругнется еще при ее вызове. Кстати и выдаст инфу нужную для правильного ее заполнения, но это криво все и косо

Старый 24.05.2010, 18:26
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 9  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Посмотрите в сторону GOF-паттерна State.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 03.06.2010, 16:35
Troglodit вне форума Посмотреть профиль Отправить личное сообщение для Troglodit Найти все сообщения от Troglodit
  № 10  
Ответить с цитированием
Troglodit

Регистрация: Feb 2001
Сообщений: 33
А чем тут он поможет ? причем тут разные состояния ?

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

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

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


 


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


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