代码之家  ›  专栏  ›  技术社区  ›  serg

如何从actionscript发出同步URL请求?

  •  3
  • serg  · 技术社区  · 14 年前

    我在actionscript中有一个大循环,它向url发送大量数据:

    for(var i=0;i<1000;i++) {
        var request:URLRequest = new URLRequest();
        request.url = url;
        request.method = URLRequestMethod.POST;
        request.data = data;
    
        var loader:URLLoader = new URLLoader();
    
        loader.load(request);
    }
    

    问题是,因为urloader只能进行异步调用,它一次发送上千个请求,这会杀死web服务器。

    除此之外,它的行为也有点奇怪。假设循环运行了5分钟。在整个5分钟内,没有任何请求到达web服务器,然后在结束时,所有请求都会立即发送。我已经尝试了我能想到的一切(空循环、回调、延迟)-没有任何帮助。无论发生什么情况,所有请求都会立即发送。

    如何使请求同步,这样它将发送一个又一个请求?有人能提出解决办法吗?

    1 回复  |  直到 14 年前
        1
  •  6
  •   Patrick    14 年前

    您不能进行同步呼叫,但可以等到服务器回复后再发送另一个请求。

    但是,如果你真的要在一个循环中向一个web服务器发送上千个请求,那么可能存在设计缺陷?

    // small example to see how do the chaining call
    
    class A extends EventDispatcher {
     private var urlLoader:URLLoader;
     private var urlRequest:URLRequest;
     private var sendCount:int=0;
    
     //......
    
     public function init(url:String):void{
      urlLoader=new URLLoader();
      urlLoader.addEventListener(Event.COMPLETE, sendData);
      urlRequest = new URLRequest();
      request.url = url;
      request.method = URLRequestMethod.POST;
      count=1000;
     }
    
     //....
     private var data:Object;
    
     //.....
     // 
     function sendData(e:Event=null):void{
      if (count-- > 0) {
       urlRequest.data = data; // put the data based on the counter
       urlLoader.load(urlRequest);
      } else {
       urlLoader.removeEventListener(Event.COMPLETE, sendData);
       dispatchEvent(new Event(Event.COMPLETE));
      }
     }
    }
    
    
    var a:A=new A();
    a.addEventListener(Event.COMPLETE, function():void{
     trace("send finished");
    }); // listen to the event complete so
        // you know when you send is finished
    
    a.init("http://...."); // ok init your send
    a.sendData(); // and start the send that will be chain each time the webserver answer