AS3注册项请求类报错:原因排查、处理方案及参数确认
GetRegistrationItemsRequest类AS3代码错误问题解答
1. 错误产生的原因是什么?
结合代码分析,可能的错误原因包括:
- 类型未声明:成员变量
secure、gender未指定AS3强类型,编译或运行时会触发类型错误 - JSON解析容错缺失:
onRequestResponse中直接嵌套解析JSON,若接口返回格式不符合数组套字符串的结构,或返回非JSON格式数据,会直接抛出解析异常;且依赖的JSONDecoder若存在版本兼容问题也会导致失败 - 静态缓存并发风险:
itemsBoy、itemsGirl为静态Map,多实例调用sendRequest时可能出现数据覆盖、读取混乱的问题 - URL请求配置错误:
sendInqueryRequest中给GET请求设置contentType为text/html,不符合GET请求参数传递的规范;若serverConfig.getRegistrationItemsUrl返回无效URL,会触发IOError - 类型转换不安全:直接对
_loc4_[ITEM.ID]、_loc4_[ITEM.TYPE]执行int()转换,若对应字段不存在或非数字类型,会抛出类型转换错误
2. 如何处理这类错误?
针对上述问题,对应处理方案如下:
- 补全类型声明:给
secure添加:Boolean类型,gender添加:int类型,符合AS3强类型要求 - 增强JSON解析容错:在
onRequestResponse中用try-catch包裹解析逻辑,捕获解析异常并触发错误事件;解析前先验证响应数据的格式合法性 - 优化静态缓存:若不需要跨实例共享物品数据,将
itemsBoy、itemsGirl改为实例变量;若需共享,新增单例缓存管理类,添加同步逻辑避免并发冲突 - 修正URL请求配置:移除GET请求的
contentType设置,或改为application/x-www-form-urlencoded;提前验证serverConfig.getRegistrationItemsUrl返回的URL有效性 - 类型安全检查:在执行
int()转换前,先判断字段是否存在且为数字类型,比如用isNaN()做校验 - 完善错误重试:在重试逻辑中添加延迟(比如用
setTimeout),避免短时间内频繁请求服务器
3. 如何针对该错误构建对应文件?
根据错误类型,可构建或修改以下文件:
- 修改原类文件:直接编辑
GetRegistrationItemsRequest.as,补全变量类型、添加解析容错逻辑、修正请求配置 - 新增JSON工具类:创建
JSONUtil.as,封装安全的JSON解析方法,包含格式校验、异常捕获逻辑,供原类调用 - 新增缓存管理类:创建
ItemCacheManager.as单例类,专门管理男女物品的缓存数据,提供线程安全的添加、获取缓存方法,替代原类的静态Map - 优化配置类:调整
ServerConfig.as中的getRegistrationItemsUrl方法,增加URL有效性校验,确保返回合法地址
4. 如何确定文件所需的参数信息?
各文件所需参数可通过以下方式确定:
- GetRegistrationItemsRequest.as:
- 构造参数:
ServerConfig实例需提供有效的getRegistrationItemsUrl方法,返回对应环境的物品接口URL;secure参数为布尔值,决定使用HTTP还是HTTPS协议 - 请求参数:
sendRequest的gender参数为int类型,1代表男性物品,2代表女性物品
- 构造参数:
- JSONUtil.as:
- 解析方法参数:待解析的字符串、解析失败时的默认返回值(比如空数组或空对象)
- ItemCacheManager.as:
- 缓存操作参数:性别标识(1/2)、物品数据对象(需包含
ITEM.ID、ITEM.TYPE等约定字段)
- 缓存操作参数:性别标识(1/2)、物品数据对象(需包含
- 错误处理参数:自定义错误事件需携带错误类型、错误详情文本,用于上层处理错误
优化后的代码示例
package com.vtweens.components.website.server_requests.register { import com.adobe.serialization.json.JSONDecoder; import com.vtweens.consts.ITEM; import com.vtweens.dataobjects.item.ImageItemNoCache; import com.vtweens.shell.ServerConfig; import com.vtweens.util.Log; import com.vtweens.util.Map; import flash.display.Sprite; import flash.events.Event; import flash.events.EventDispatcher; import flash.events.IOErrorEvent; import flash.net.URLLoader; import flash.net.URLRequest; import flash.net.URLRequestMethod; import flash.net.URLVariables; import flash.utils.setTimeout; public class GetRegistrationItemsRequest extends EventDispatcher { private static var itemsBoy:Map = new Map(); private static var itemsGirl:Map = new Map(); private static const MAX_RETRIES = 2; private static const RETRY_DELAY = 1000; private var serverConfig:ServerConfig; private var secure:Boolean; private var gender:int; private var retries = 0; public function GetRegistrationItemsRequest(param1:ServerConfig, param2:Boolean) { super(); this.serverConfig = param1; this.secure = param2; } public static function getItemImage(param1:Object, param2:String = ".") : Sprite { if(param1) { return new ImageItemNoCache(param1[ITEM.TYPE],param1[ITEM.ORDINAL],param1[ITEM.ID],param1[ITEM.INVENTORY_TYPE],null,null,param2); } return new Sprite(); } public function sendRequest(param1:int) : void { var _loc2_:URLVariables = null; this.gender = param1; if(param1 == 1 && itemsBoy.size() > 0 || param1 == 2 && itemsGirl.size() > 0) { dispatchEvent(new Event(Event.COMPLETE)); } else { _loc2_ = new URLVariables(); _loc2_.gender = param1; this.sendInqueryRequest(_loc2_,this.onRequestResponse,this.onRequestError); } } private function onRequestError(param1:IOErrorEvent) : void { param1.target.removeEventListener(Event.COMPLETE,this.onRequestResponse); param1.target.removeEventListener(IOErrorEvent.IO_ERROR,this.onRequestError); Log.error("AllProductsRequest: onRequestError error:" + param1.text); if(this.retries < MAX_RETRIES) { ++this.retries; Log.error("AllProductsRequest: Retrying (" + this.retries + ")"); setTimeout(()=>{this.sendRequest(this.gender)}, RETRY_DELAY); } else { dispatchEvent(new IOErrorEvent(IOErrorEvent.IO_ERROR)); } } private function onRequestResponse(param1:Event) : void { var _loc3_:* = undefined; var _loc4_:Object = null; param1.target.removeEventListener(Event.COMPLETE,this.onRequestResponse); param1.target.removeEventListener(IOErrorEvent.IO_ERROR,this.onRequestError); try { var _loc2_:Array = new JSONDecoder(param1.target.data).getValue(); for each(_loc3_ in _loc2_) { _loc4_ = new JSONDecoder(_loc3_).getValue(); if(this.gender == 1) { if(_loc4_.hasOwnProperty(ITEM.ID) && !isNaN(_loc4_[ITEM.ID])) { itemsBoy.put(int(_loc4_[ITEM.ID]),_loc4_); } } else { if(_loc4_.hasOwnProperty(ITEM.ID) && !isNaN(_loc4_[ITEM.ID])) { itemsGirl.put(int(_loc4_[ITEM.ID]),_loc4_); } } } dispatchEvent(new Event(Event.COMPLETE)); } catch(e:Error) { Log.error("JSON解析失败: " + e.message); dispatchEvent(new IOErrorEvent(IOErrorEvent.IO_ERROR)); } } public function get itemsMap() : Map { if(this.gender == 1) { return itemsBoy; } return itemsGirl; } public function getItemsObjByType(param1:int) : Array { var _loc4_:* = undefined; var _loc2_:Array = []; var _loc3_:* = this.gender == 1 ? itemsBoy.getValues() : itemsGirl.getValues(); for each(_loc4_ in _loc3_) { if(_loc4_.hasOwnProperty(ITEM.TYPE) && !isNaN(_loc4_[ITEM.TYPE]) && int(_loc4_[ITEM.TYPE]) == param1) { _loc2_.push(_loc4_); } } return _loc2_.sortOn(ITEM.ORDINAL,Array.NUMERIC); } private function sendInqueryRequest(param1:URLVariables, param2:*, param3:*) : * { var _loc4_:URLRequest = null; var _loc5_:URLLoader = null; _loc4_ = new URLRequest(this.serverConfig.getRegistrationItemsUrl(this.secure)); _loc4_.method = URLRequestMethod.GET; _loc4_.data = param1; _loc5_ = new URLLoader(); _loc5_.addEventListener(Event.COMPLETE,param2); _loc5_.addEventListener(IOErrorEvent.IO_ERROR,param3); _loc5_.load(_loc4_); } } }
内容的提问来源于stack exchange,提问作者JustMoon
相关产品推荐
相关产品推荐

