Получить последние 2 результата из сервисного вызова в Flex AS3 PHP - PullRequest
0 голосов
/ 31 июля 2011

Я новичок в Flex, и я искал и StackOverflow, и Google, но, похоже, не могу решить эту (простую) проблему с асинхронным программированием Flex / ActionScript 3. У меня есть сервис PHP (Zend), который вставляет строку в таблицу. Что я хотел бы сделать, так это иметь возможность дважды вызывать службу с разными значениями строк и возвращать новые идентификаторы (первичные ключи), возвращаемые службой. Затем я отображаю новые идентификаторы как 2 оповещения.

Проблема в том, что, когда я могу выполнить сервис дважды подряд, я получаю только Alert.show () для последнего и самого последнего вызова сервиса. Я не знаю, как получить доступ к результату первого.

Я понимаю, что могу переконфигурировать свой код Flex и службу PHP, чтобы принимать массив объектов, и просто отправить один вызов службы PHP для обоих и получить обратно объект массива с результатами, но я также пытаюсь получить лучшее понимание того, как работает AsyncToken и как получить доступ к старым нужным мне результатам. Каждое использование {serviceResult} .token перезаписывает мой предыдущий результат?

<s:NavigatorContent xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
   // ...

Вот мой связанный код, в котором я хочу настроить 2 папки по умолчанию для новых пользователей: «Home» и «temp»:

 // imports
 import mx.collections.ArrayCollection;
 import mx.controls.Alert;
 import mx.events.CloseEvent;
 import mx.events.FlexEvent;
 import mx.rpc.AsyncToken;
 import mx.rpc.IResponder;
 import mx.rpc.events.FaultEvent;
 import mx.rpc.events.ResultEvent;
 import mx.rpc.remoting.mxml.RemoteObject;
 import mx.rpc.Responder;
 import spark.events.IndexChangeEvent;

import valueObjects.Folders;


// When the user clicks "Save" button, 2 new folders are created for a new user:
protected function pendingUserSaveButton_clickHandler(event:MouseEvent):void 
{
       // Create 2 initial user folders: Home and temp-taiwan
       var t1Folders:Folders = new Folders();

   t1Folders.users_email = tempUser.email;
   t1Folders.name = t1Folders.description = "Home";

   createFoldersFunction( t1Folders ); // assume returns folder ID = 100

   var t2Folders:Folders = new Folders();
   t2Folders.users_email = tempUser.email;
   t2Folders.name = t2Folders.description = "temp";

   createFoldersFunction( t2Folders ); // assume returns folder ID = 101
}

и вот мои обработчики событий, и я хочу, чтобы всплывающее окно для каждого нового идентификатора появлялось:

protected function createFoldersFunction(item:Folders):void
{
    createFoldersResult.token = foldersService.createFolders(item);
}

protected function createFoldersResult_resultHandler(event:ResultEvent):void
{
    Alert.show("Folder #" + ((event.result as int) as String) + " created");
            // Currently, I only get Alert saying "Folder #101 created".
            // I want to see 2 Alerts - one for #100 and another for #101

}

и вот мои mx коды для звонка и обслуживания:

<s:CallResponder id="createFoldersResult"
    result="createFoldersResult_resultHandler(event)"/>
<foldersservice:FoldersService id="foldersService"
    fault="Alert.show(event.fault.faultString + '\n' + event.fault.faultDetail)"
    showBusyCursor="true"/>

Только '101' (результат второго сервисного вызова) вызывает оповещение. Почему это?

Спасибо!

1 Ответ

1 голос
/ 01 августа 2011

Ваш код переопределяет токен, на который должен отвечать createFoldersResult.Правильный код был бы:

protected function createFoldersFunction(item:Folders):void
{
    var token:AsyncToken = foldersService.createFolders(item);
    var responder:Responder = new Responder(createFoldersResult_resultHandler, someFaultHandler)
    token.addResponder(responder);
}

другой параметр мог бы установить обработчик результатов для createFolders непосредственно в mxml, поэтому ваш folderservice: FoldersService будет:

<foldersservice:FoldersService id="foldersService"
    fault="Alert.show(event.fault.faultString + '\n' + event.fault.faultDetail)"
    showBusyCursor="true">
    <mx:method name="createFolders" result="createFoldersResult_resultHandler(event)"/>
</foldersservice:FoldersService>

тогда выне требуется createFoldersFunction, вы можете напрямую вызывать folderService.createFolders.

...