Попытка понять AsyncToken во Flex / Actionscript - PullRequest
2 голосов
/ 04 августа 2009

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

Следующий код, надеюсь, объяснит, что я пытаюсь сделать. Не стесняйтесь изменить блок кода в качестве объяснения.

Спасибо.

public function testSerivceCall(data:Object, callBackCommand:String):void
{
    // Assume callBackCommand == "FOO";
    // How can I pass in callBackCommand as a parameter to the result or fault events?
    // How do I create an async token here?

    var remoteObject:RemoteObject;
    remoteObject = new RemoteObject();
    remoteObject.destination = "zend";
    remoteObject.source = "MyService";
    remoteObject.endpoint = "http://example.com/service";
    remoteObject.test.addEventListener(ResultEvent.RESULT, _handleTestResult);
    remoteObject.test.addEventListener(FaultEvent.FAULT, _handleTestFault);
    remoteObject.test(data);
}

private function _handleTestResult( event:ResultEvent ) : void 
{ 
    // How do I get the async token value?
    // How can I get the value of callBackCommand in this code block?

    if (callBackCommand == "FOO")
    { 
        // do something related to "FOO"
    }
    else
    {
        // do something else with the result event
    }


} 

private function _handleTestFault( event:FaultEvent ) : void 
{ 
    // How do I get the async token value?
    // How can I get the value of callBackCommand in this code block?
} 

Правка для уточнения этого вопроса:

Предположим, я выполняю следующий вызов метода где-то в моем коде:

testSerivceCall(personObject, "LoginCommand");

Как получить доступ к фактической строке "LoginCommand" внутри функционального блока _handleTestResult?

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

У меня просто время грохнуло синтаксис и функциональность AsyncToken.

Ответы [ 4 ]

4 голосов
/ 13 июля 2010

Я даже не нуждался в замыканиях. Я добавил класс как ниже, который я назвал внешне.

Звонок был такой:

 public class MyClass
 {
    ...
    var adminServerRO:AdminServerRO = new AdminServerRO();
    adminServerRO.testSerivceCall("FOO",cptyId);
 }

public class AdminServerRO
{

   private function extResult( event:ResultEvent, token:Object ) : void
   {
       //the token is now accessed from the paremeter
        var tmp:String = "in here";
   }

   private function extFault( event:FaultEvent ) : void
   {
     var tmp:String = "in here";
   }


   public function testSerivceCall(callBackCommand:String, cptyId:String):void 
   { 
      var remoteObject:RemoteObject = new RemoteObject(); 
      remoteObject.destination = "adminServer"; 
      var token:AsyncToken = remoteObject.getCounterpartyLimitMonitorItemNode(cptyId);
      token.addResponder(new AsyncResponder(extResult,extFault,cptyId));
   } 

}

2 голосов
/ 21 декабря 2011

Хотя принятый ответ будет выполнять то, что хочет первоначальный отправитель, он фактически не отвечает на заданный вопрос. AsyncToken создается в результате удаленного вызова метода и доступен из ResultEvent. Поскольку AsyncToken является динамическим классом, вы можете добавить к нему любое свойство, которое захотите. Код ниже должен продемонстрировать это:

public function testSerivceCall(data:Object, callBackCommand:String):void
{

     var remoteObject:RemoteObject;
     remoteObject = new RemoteObject();
     remoteObject.destination = "zend";
     remoteObject.source = "MyService";
     remoteObject.endpoint = "http://example.com/service";
     remoteObject.test.addEventListener(ResultEvent.RESULT, _handleTestResult);
     remoteObject.test.addEventListener(FaultEvent.FAULT, _handleTestFault);
     var token:AsyncToken = remoteObject.test(data);
     token.callBackCommand = callBackCommand;
}

private function _handleTestResult( event:ResultEvent ) : void 
{ 

     if (event.token.callBackCommand == "FOO")
     { 
         // do something related to "FOO"
     }
     else
     {
         // do something else with the result event
     }


 } 

 private function _handleTestFault( event:FaultEvent ) : void 
 { 
      //event.token.callBackCommand should be populated here too
 }
1 голос
/ 04 августа 2009

Если вы хотите получить доступ к свойствам, используемым во время удаленного вызова (параметры вызова и / или AsycToken), вы можете использовать замыкания. Просто определите обработчик события результата внутри вызывающего метода как замыкание. Затем он может получить доступ к любой переменной в вызывающей функции.

public function testSerivceCall(data:Object, callBackCommand:String):void
{
    var _handleTestResult:Function = function( event:ResultEvent ) : void 
    { 
        // token is visible here now
        if (callBackCommand == "FOO")
        { 
            // do something related to "FOO"
        }
        else
        {
            // do something else with the result event
        }
    }

    var remoteObject:RemoteObject;
    remoteObject = new RemoteObject();
    remoteObject.destination = "zend";
    remoteObject.source = "MyService";
    remoteObject.endpoint = "http://example.com/service";
    remoteObject.test.addEventListener(ResultEvent.RESULT, _handleTestResult);
    remoteObject.test.addEventListener(FaultEvent.FAULT, _handleTestFault);
    var token = remoteObject.test(data);
}
1 голос
/ 04 августа 2009

Если я правильно читаю ваш вопрос, вы пытаетесь выяснить, как получить доступ к фактическим данным, возвращаемым ResultEvent?

Если это так, при условии, что вы правильно сделали вызов и вернули данные в ожидаемом формате:

private function _handleTestResult( event:ResultEvent ) : void 
{ 
  // you get the result from the result property on the event object
  // edit: assuming the class Person exists with a property called name
  //       which has the value "John"
  var person : Person = event.result as Person;

  if (person.name == "John")
  { 
      Alert.show("John: " + person.name);
  }
  else
  {
      Alert.show("Not John: " + person.name);
  }
} 

private function _handleTestFault( event:FaultEvent ) : void 
{ 
  // Maybe you know the type of the returned fault
  var expectedFault : Object = event.fault as MyPredefinedType

  if (expectedFault.myPredefinedTypesPredefinedMethod() == "BAR")
  {
    // something here
  }
}

ResultEvent имеет свойство под названием result, которое будет содержать экземпляр объекта, возвращаемого результатом (это может быть выходной файл XML, если используется веб-служба, или сериализованный объект, если, например, используется AMF). Это то, что вы хотите получить доступ. Аналогично, FaultEvent имеет свойство сбоя, которое возвращает информацию о сбое.

Редактировать: Изменен код в _handleTestResult() в ответ на комментарий Гордона Поттера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...