2010-08-09 9 views
0

Existe-t-il un modèle de meilleure pratique pour implémenter une file d'attente pour l'envoi de demandes ordonnées? Je sais que cela touche la logique derrière les demandes ansynchronous, mais dans certains cas on a besoin d'envoyer :) file d'attenteEnvoi de message en file d'attente avec Prototype.AJAX

Voici ma première tentative:

this.queue = [], 
this.sending = false, 
send: function(message) { 
    if (this.sending) { 
     this.queue.push(message); 
    } else { 
     else this.push(message); 
    } 
}, 
push: function(message) { 
    this.sending = true; 
    new Ajax.Request(this.outURL + "&message=" + encodeURIComponent(message), { 
     onSuccess: function() { 
      this.sending = false; 
      if (this.queue.size() > 0) { 
       this.push("queued: " + this.queue.shift()); 
      } 
     }.bind(this) 
    }); 
}, 

Y at-il une meilleure mise en œuvre? Merci d'avance :)

Répondre

0

Ne meurs pas seul !! Je pense que votre classe/espace de nom peut être un peu foiré depuis votre mélange: et = (vous ne pouvez pas utiliser = l'intérieur d'un objet {} namespace)

AjaxQueue = { 
    outURL: '/ajax.html', 
    queue: [], 
    sending: false, 

    //Stick message on the queue array 
    send: function(message) { 
     this.queue.push(message); 
     this.iterate(); 
    }, 
    //If theres a message on the queue array send it, then recursively calls itself 
    iterate: function() { 
     message = this.queue.pop() 
     //this will be false and stop recursion when there are no more messages 
     if (message) 
     { 
      new Ajax.Request(this.outURL, { 
       //no need to use string appending or encodeURL, prototype does this for you 
       parameters: {message: message}, 
       method: 'GET', 
       onSuccess: function() { 
        //recursion. We avoid this because it wont be in scope 
        AjaxQueue.iterate() 
       } 
      }); 
     } 
    } 
} 

Code pour tester

AjaxQueue.send('First Message'); AjaxQueue.send('Second message'); AjaxQueue.send('Third Message') 

Try this avec un vrai gros fichier ou un script lent et vous verrez la fonctionnalité de file d'attente fonctionner.