我在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分钟没有请求进入Web服务器,最后它们都被立即发送。我已经尝试了我能想到的一切(空循环,回调,延迟) - 没有任何帮助。无论如何,所有请求都会立即发送。
如何使请求同步,所以它会一个接一个地发送请求?有人可以建议任何解决方案?
答案 0 :(得分:6)
您无法进行同步通话,但您可以等到服务器回复后再发送另一个请求。
但是,如果真的必须在一个循环中向网络服务器发送一千个请求,那么可能存在设计缺陷?
// 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