2011-08-28

AS3用于服务器通讯的类中几个很有用的方法

//使用的时候像这个样子
public function sync(xindex:Number,yindex:Number):void
{
  addProcessor(IO_SYNC_URL, processorSync, DataEvent.SYNC_RESULT, DataEventError.SYNC_ERROR);
  var params:Object = new Object();
  params["xi"] = xindex;
  params["yi"] = yindex;
  executeRequest(IO_SYNC_URL, getRequest(IO_SYNC_URL, params, URLRequestMethod.GET));
}

//这个函数返回带参数的URLRequest
private function getRequest(url:String, params:Object, requestMethod:String="GET"):URLRequest
{
  var req:URLRequest = new URLRequest();
  req.url = IO_BASE_URL+url+makeGETParamString(params);
  req.method = requestMethod;
  trace(req.url);
  return req;
}

//这里注册事件,以及响应函数;那个serviceLoader、loaderMap是这样定义的
//private var serviceLoader:Dictionary = new Dictionary();
//private var loaderMap:Dictionary = new Dictionary();
private function addProcessor(name:String, dataProcess:Function, resultEventType:String, errorEventType:String):void
{
  if (null == serviceLoader[name])
  {
    var loader:URLLoader=new URLLoader();
    loader.addEventListener(Event.COMPLETE, loader_onComplete);
    loader.addEventListener(IOErrorEvent.IO_ERROR, loader_onError);
    loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, loader_onSecurityError);
    serviceLoader[name]=loader;
    loaderMap[loader]={dataFunc: dataProcess, resultEvent: resultEventType, errorEvent: errorEventType};
  }
}

//这里就load了
private function executeRequest(name:String, req:URLRequest):void
{
  var urlLoader:URLLoader = serviceLoader[name] as URLLoader;
  urlLoader.load(req);
}

//这里是一些响应函数,最后触发定义好的事件
private function loader_onComplete(event:Event):void
{
  var loader:URLLoader=event.target as URLLoader;
  var processor:Object=loaderMap[loader];
  var data:String = loader.data as String;

  if(data.toString()=="oauthlost"){
    var req:URLRequest = new URLRequest(FLASH_URL);
    navigateToURL(req,"_self");
    /*var ioError:DataEventError = new DataEventError(processor.errorEvent);
    ioError.message = "get map error";
    dispatchEvent(ioError);*/
    return;
  }else{
    var e:DataEvent = new DataEvent(processor.resultEvent);
    e.result = processor.dataFunc(data);
    dispatchEvent(e);
  }
}
private function loader_onError(event:IOErrorEvent):void
{
  var loader:URLLoader=event.target as URLLoader;
  var processor:Object=loaderMap[loader];
  var error:DataEventError=new DataEventError(processor.errorEvent);
  error.message=event.text;
  dispatchEvent(error);
}

private function loader_onSecurityError(event:SecurityErrorEvent):void
{
  dispatchEvent(event);
}


private function makeGETParamString(parameters:Object):String
{
  var paramStr:String=makeParamsToUrlString(parameters);
  if (paramStr.length > 0)
  {
    paramStr="?" + paramStr + "&r=" + Math.random();
  }else{
    paramStr="?r=" + Math.random();
  }
  return paramStr;
}
private function makeParamsToUrlString(params:Object):String
{
  var retParams:Array=[];

  for (var param:String in params)
  {
    retParams.push(param + "=" + params[param].toString());
  }

  retParams.sort();

  return retParams.join("&");
}

No comments: