Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   Почему не диспатчится ивент? (http://www.flasher.ru/forum/showthread.php?t=165172)

Silicium 20.08.2011 23:11

Почему не диспатчится ивент?
 
Код AS3:

public function addObject(clan:int, key:String, name:String, x:int, y:int, desc:String, onResult:Function = null):void
{
        if (onResult != null)
                addObjectResult = onResult;
        if (addObjectResult != null)       
                if (!service.getOperation('addObject').hasEventListener(ResultEvent.RESULT))
                        service.getOperation('addObject').addEventListener(ResultEvent.RESULT, addObjectResult);
        service.getOperation('addObject').send(clan, key, name, x, y, desc);
}

Это кусок кода из модуля (<s:Module/>), содержащего <s:RemoteObject/> (id="service") и помещенного в отдельный проект библиотеки.
В нем так же присутствует публичная переменная addObjectResult. Этот кусок кода замечательно работает при первом вызове. Я передаю onResult, и этот метод благополучно вызывается по событию. Но при последующих вызовах этого не происходит. Условие if (!service.getOperation('addObject').hasEventListener(ResultEvent.RESULT)) выполняется, и, я полагаю, прослушивателем является функция, переданная в качестве параметра при предыдущем вызове (т.е. та же самая). Но, еще раз повторюсь, вызова ее не происходит. Вопрос?

ShockWave512 21.08.2011 01:11

подпишите на получение результа service, для проверки

Silicium 21.08.2011 02:21

Неа, тишина. Запрос проходит (данные в базе обновляются), а ответа нет.
ПС: еще стати вопрос не по теме (проше не заострять на него внимание). Каждый раз перед дебагом приходится делать клин библиотэки, это нормально?

Добавлено через 10 минут

Код:

[RPC Fault faultString="error" faultCode="Channel.Call.Failed" faultDetail="NetConnection.Call.Failed: HTTP: Status 500"]
Вот какой зверь выскакивает, хотя повторюсь, удаленный метод выполняется.

ShockWave512 21.08.2011 03:05

кстати документация говорит что каждый раз создается новый AbstractOperation
http://help.adobe.com/ru_RU/FlashPla...peration%28%29
может лучше один раз вызвать getOperation() ? от греха подальше

Добавлено через 5 минут
мне хорошо помог переход на HTTPService (XML), одно время
тоже какие то глючки постоянно сыпались с RemoteObject

alatar 21.08.2011 04:43

Не стоит проверять одну операцию, подписываться у второй и вызывать send у третьей.
Код AS3:

public function addObject(clan:int, key:String, name:String, x:int, y:int, desc:String, onResult:Function = null):void
{
        if (onResult != null)
        {
                var operation:AbstractOperation = service.getOperation('addObject');
                operation.addEventListener(ResultEvent.RESULT, addObjectResult);
                operation.send(clan, key, name, x, y, desc);
        }
}

Заодно почитайте о AsyncToken и IResponder.

Silicium 21.08.2011 14:46

Всем спасибо большое.
Цитата:

кстати документация говорит что каждый раз создается новый AbstractOperation
В документации сказанно
Цитата:

. Если операция не была создана заранее, в течение этого вызова создается новая операция
Так что читая ее (что я собственно и делал) не мог и подумать, что выйдет какая-то белеберда.
Однако и Ваш, alatar, способ не поможет, так-как .getOperation будет все ровно вызываться каждый раз при вызове addObject.
На последок скажу, что помагать-то уже и не зачем! Сегодня запустил - все работает без косяков :-/
*слов нет*
Всем спасибо за участие, вопрос приподзакрыт.

ShockWave512 21.08.2011 16:23

Цитата:

Сообщение от Silicium (Сообщение 1023990)
Однако и Ваш, alatar, способ не поможет, так-как .getOperation будет все ровно вызываться каждый раз при вызове addObject.

статические элементы никто не отменял (да и без них легко обойтись )

Код AS3:

private static var operation:AbstractOperation = null
 
private function addObject():void
{
    if ( operation != null )
      {
            operation.addObject();
      }
      else
      {
            operation = getOperation("name");
      }
}


Silicium 21.08.2011 17:25

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

var operation:AbstractOperation = service.getOperation('addObject');
if (onResult != null)
{
        if (addObjectResult != null)
                operation.removeEventListener(ResultEvent.RESULT, addObjectResult);
        addObjectResult = onResult;
        operation.addEventListener(ResultEvent.RESULT, addObjectResult);
}
operation.send(clan, key, params);



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

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