Как сделать синхронные URL-запросы из ActionScript? - PullRequest
3 голосов
/ 14 сентября 2010

У меня есть большой цикл в 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);
}

Проблема в том, что URLLoader может делать только асинхронные вызовы, он отправляет все эти тысячи запросов одновременно, что убивает веб-сервер.

Кроме того, это немного странно.Допустим, цикл длится 5 минут.Целых 5 минут на веб-сервер не поступают запросы, затем в конце они отправляются сразу.Я уже перепробовал все, что мог придумать (пустые циклы, обратные вызовы, задержки) - ничего не помогает.Все запросы отправляются сразу, несмотря ни на что.

Как сделать запросы синхронными, чтобы он отправлял один запрос за другим?Может кто-нибудь предложить какое-либо решение?

1 Ответ

6 голосов
/ 14 сентября 2010

Вы не можете сделать синхронный вызов, но вы можете подождать, пока сервер ответит, прежде чем отправлять другой запрос.

Но, возможно, есть недостаток дизайна, если действительно вам нужно отправить тысячу запросоввеб-сервер за один цикл?

// 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
...