2010-09-13 16 views
3

J'ai une grande boucle en actionscript qui envoie beaucoup de données à une URL:Comment faire des requêtes d'URL synchrones à partir d'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); 
} 

Le problème est dû au fait que URLLoader peut faire des appels asynchrones, il envoie toutes ces milliers de demandes à la fois qui tue webserver.

En outre, il agit un peu étrange en plus de cela. Disons que la boucle tourne pendant 5 minutes. Pendant 5 minutes entières, aucune demande ne parvient au serveur Web, et à la fin, toutes les demandes sont envoyées en même temps. J'ai déjà essayé tout ce que je pouvais penser (boucles vides, rappels, retards) - rien n'y fait. Toutes les demandes sont envoyées à la fois, peu importe quoi. Comment faire des demandes synchrones, de sorte qu'il va envoyer une demande après l'autre? Quelqu'un peut-il suggérer une solution?

Répondre

6

Vous ne pouvez pas effectuer d'appel synchrone, mais vous pouvez attendre que le serveur réponde avant d'envoyer une autre requête.

Mais peut-être il y a un défaut de conception si vraiment vous devez envoyer une demande de mille à un serveur web dans une boucle?

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