Как я могу отменить AMF Call с NetConnection?
Допустим, у меня есть объект NetConnection внутри шаблона Singleton, который используется всеми классами объекта доступа к данным во всем приложении. Теперь вы вышли на экран и попросили загрузить 5 тысяч записей, потому что вы хотите найти какую-то ошибку или что-то еще. Но теперь вы только что поняли, что находитесь не на том экране и вам на самом деле нужно 5 тысяч записей от другого "Сущности". Как запретить вам ждать почти 2 минуты, пока данные не попадут сюда, чтобы вы могли перейти на другой экран и запросить другие данные? Я пытался использовать кнопку ESC в качестве ключевого абонента на NetConnection.close()
событие, но на самом деле это не работает. Он просто отправляет пустое событие, и вызов все еще возвращается. Я знаю, что не могу попросить сервер не продолжать выполнять свою работу, но я хочу знать, как я могу убедиться, что после того, как вы нажали ESC или что-то в этом роде, ActionScript больше не будет беспокоиться об этом конкретном вызове, и вы сможете двигаться дальше со своей жизнью. И когда сервер ответит на этот вызов, в фоновом режиме я собираюсь выбросить его, потому что вы уже согласились отменить его.
Ps.: У меня нет никаких сомнений в том, как слушать кнопку ESC и вызывать какой-то метод через нее, я просто хочу знать, что вызывать, когда пользователь решил, что он больше не хочет получать эти данные, и он / она хочет двигаться дальше, не закрывая приложение и не открывая снова.
Редактировать:
Я попытался уничтожить объект Responder после выполнения вызова, но это не сработало.
public function call(command:String, f:Function, fault:Function, ...parameters):void{
var r:Responder = new Responder(f, fault);
this._Responder = r;
if(parameters.length == 0)
GATEWAY.call(command, _Responder);
else
GATEWAY.call(command, _Responder, parameters);
}
public function close():void{
_Responder = new Responder(function(obj:Object):void{}, function(obj:Object):void{});
//_Responder = null;
trace("Canceled");
}
с кодом, описанным здесь, я перестал звонить NetConnection::call
и начал вызывать "функцию вызова", которую я написал. Таким образом, эта функция создаст ответчик, который будет находиться в области видимости класса, чтобы я мог получить к нему доступ даже после того, как был сделан вызов, и кнопка ESC вызовет функцию "Закрыть". Я попытался установить его в ноль и восстановить его. Это не сработало. Я думаю, что после того, как NetConnection сделает вызов, ответчик не может быть изменен.
1 ответ
Класс NetConnection не поддерживает отмену вызовов AMF. Однако, как сказал shaunhusain, вы можете хранить в памяти (массив, словарь и т. Д.) Методы, вызываемые из вашего одноэлементного класса, и как только вы отмените вызов, он должен отключить прослушиватели результирующих событий только для этого вызова.
Таким образом, даже если вы выйдете из модуля, ожидающего результата от AmfCall, не будет никаких обратных вызовов из вашего синглтон-класса, и вы сможете перейти к следующему экрану.
public class Call
{
var responder:Responder;
var service:String;
var params:Array;
public function Call(service:String, params:Array)
{
responder = new Responder(this.onResult, this.onFault);
this.service = service;
this.params = params;
}
public function removeListeners():void
{
removeEventListener(CallEvent.RESULT, onResult);
}
public function onResult(result:Object):void
{
this.result = result;
dispatchEvent(new CallEvent(CallEvent.RESULT, callId, result));
}
}
Класс Call отвечает за диспетчеризацию событий при получении результата. Однако, если нет прослушивателей событий, отправленные события не будут прослушиваться ни одним классом.
Этот фрагмент кода взят из AmfPhpToolBox. Возможно, вы захотите использовать эту библиотеку вместо этого, чтобы решить все эти проблемы.