2010-09-13 4 views
3

У меня есть большой цикл в ActionScript, который посылает много данных на веб-сайте:Как сделать синхронные запросы URL из ActionScript?

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 минут на веб-сервер не поступает запросов, затем в конце все они отправляются сразу. Я уже пробовал все, что мог подумать (пустые циклы, обратные вызовы, задержки) - ничего не помогает. Все запросы отправляются сразу независимо от того, что.

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

ответ

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 
Смежные вопросы