Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   последовательность обращений к серверу с callback. Как красивее сделать? (http://www.flasher.ru/forum/showthread.php?t=140175)

Troglodit 22.05.2010 13:07

последовательность обращений к серверу с 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 и не разбирая их код.

Спасибо

enepx 22.05.2010 16:30

Почему бы Вам не сделать какой-нибудь массив-очередь и опрашивать сервер последовательно следуя этой очереди? По получении каждого callback'а проверять остались ли еще незагруженные элементы в очереди. Количество загруженных или оставшихся можно сделать отдельной переменной.
Дерзайте.

Troglodit 22.05.2010 20:32

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

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

enepx 24.05.2010 13:44

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

Troglodit 24.05.2010 15:17

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

что приходит тут на ум - это понасоздавать классов - хранителей функций и параметров, типа Function_Int_String_String его параметры забивать в конструкторе. И тогда function
Код AS3:

step1( onSuccess:Function_Int_String_String,onFailed:Function_Boolean):void;

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

gloomyBrain 24.05.2010 15:26

Можно сделать примерно так:
Код AS3:

public function onSuccess(...args):void {
        // ну а тут уже решаем, что к нам пришло
        switch(args.length) {
                ...
        }
}


-De- 24.05.2010 15:49

Нормально при компиляции проверить, что переданная функция принимает такие-то параметры - никак, ибо тип Function вот такая простая вещь. Я лично этому рад.
Можно передавать не функцию, а айдишник, делать switch по айдишнику и в нем писать имя private метода. Будет что надо, но switch я лично не люблю.
Можно поставить в функции проверку на тип аргументов и помирать с криками, если не те, но рантайм будет, да.
Но так ли нужна проверка при компиляции на тип данных? Это если там куча народу этот код пишет, то может есть смысл.
И это, врачи сильно рекомендуют не создавать динамически функции. Т.е. в любом случае рекомендую сделать.
Код AS3:

private function okStep1(someData1:SomeType1):void{

и уже okStep1 передавать.

Troglodit 24.05.2010 16:57

свитч не катит тк тормозить будет если широко внедрить все это. Да народу юзает много этот код, так что хочется сделать попонятнее.

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

Цитата:

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

dimarik 24.05.2010 18:26

Посмотрите в сторону GOF-паттерна State.

Troglodit 03.06.2010 16:35

А чем тут он поможет ? причем тут разные состояния ?


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

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