3

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 が非同期呼び出ししかできないためです。数千のリクエストを一度に送信して、Web サーバーを強制終了します。

また、その上で少し奇妙な動作をします。ループが 5 分間実行されているとします。全体で 5 分間、Web サーバーにリクエストが送信されず、最後にすべてが一度に送信されます。考えられるすべてのこと(空のループ、コールバック、遅延)をすでに試しましたが、何も役に立ちません。すべてのリクエストは、何があっても一度に送信されます。

リクエストを同期して、次々とリクエストを送信する方法は? 誰でも解決策を提案できますか?

4

1 に答える 1

6

同期呼び出しを行うことはできませんが、サーバーが応答するまで待ってから別の要求を送信できます。

しかし、本当に 1 回のループで Web サーバーに 1000 のリクエストを送信する必要がある場合は、設計上の欠陥があるのでしょうか?

// 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
于 2010-09-13T21:09:33.750 に答える