В чем смысл ASyncToken?
Мне было поручено создать клиент AS3 для сервера WebSocket HTML5.
Сначала я хотел создать этот сервис, используя некоторые из существующих классов в AS3, а именно пытаться эмулировать RemoteObject, но, посмотрев на него, я не вижу смысла в ASyncToken!
Я понимаю, что токен используется в качестве некоторой формы ссылки между вызовом сервера и его ответом, но я просто не вижу, где и как он становится уникальным идентификатором.
Возьмите этот короткий кусок кода, например:
var token:AsyncToken = myService.myCall(params);
news.addResponder(new Responder(onResult, onFault));
function onResult(event:ResultEvent) {
// do stuff
}
function onFault(event:FaultEvent) {
// do stuff
}
Очевидно, что у токена есть свой собственный респондент, и служба может хранить словарь токенов-сообщений, но если бы мне пришлось дважды вызывать myService.myCall, прежде чем кто-либо из них ответит, узнает ли служба, с каким токеном связан ответ? Создает ли служба уникальный идентификатор, чтобы связать ответ с токеном, или в таких обстоятельствах произойдет сбой?
Если он хранит внутри себя свой уникальный идентификатор для вызовов, как это будет лучше, чем полное пропускание токена и передача ответчика в параметрах вызова? Например
myResponder = new Responder(onResult, onFault);
myService.myCall(myIResponder, <additional params>);
function onResult(event:ResultEvent) {
// do stuff
}
function onFault(event:FaultEvent) {
// do stuff
}
3 ответа
Выделяются две вещи:
- Вы можете назначить более одного респондента AsyncToken;
- Вы можете связать результат AsyncToken.
Вы можете найти эти две вещи полезными в зависимости от того, с какими данными вы работаете... Также может быть что-то большее, чем это.
Для более сложных приложений AsyncToken позволяет вам иметь немного больше гибкости в том, какие функции / замыкания / методы для приема данных или обработки ошибок.
public function mssqlQuery(sql:String,fid:String) : void {
var http:HTTPService = new HTTPService;
var parm:Object = new Object;
parm.fas_sql = sql;
parm.fas_db = mssql_db;
http.url = mssql_url+"?irand="+Math.random();
http.showBusyCursor = true;
http.request = sql;
http.addEventListener(ResultEvent.RESULT, mssqlResult);
http.addEventListener(FaultEvent.FAULT, mssqlFault);
http.method = "POST";
sqlToken = http.send(parm);
sqlToken.param = fid;
}