2010-10-02 4 views
2

Je cherche à mettre en œuvre une file d'attente de méthode asynchrone en Javascript comme on le voit dans this blog postfile d'attente de méthode asynchrone en Javascript

Voici ce que j'ai jusqu'à présent:

function Queue() { 
    this._methods = []; 
    this._response = null; 
    this._flushed = false; 
} 

(function(Q){ 

    Q.add = function (fn) { 
    if (this._flushed) fn(this._response); 
    else this._methods.push(fn); 
    } 

    Q.flush = function (response) { 
    if (this._flushed) return; 
    this._response = response; 
    while (this._methods[0]) { 
     this._methods.shift()(response); 
    } 
    this._flushed = true; 
    } 

})(Queue.prototype); 

Je ne peux pas sembler obtenir à travailler comme annoncé, bien que le code me semble correct. Lorsque j'appelle la fonction Flush, j'obtiens this._methods is undefined sur la ligne while (this._methods[0]) {.

Répondre

3

Comment l'utilisez vous? Si vous faites:

var q = new Queue(); 
q.flush("foo"); 

... vous ne devriez pas obtenir cette erreur, et je ne suis pas: http://jsbin.com/iduji3

+0

Ouais, je l'utilise en tant que constructeur. C'est ce qui est si bizarre. –

+0

Bon, il semble qu'il y avait un problème de portée avec la façon dont j'utilisais Queue # flush comme rappel. Cela fonctionne bien. –

+0

@Adam: Ah, si vous l'utilisiez comme * callback *, votre problème serait que 'this' ne sera pas ce que vous attendez dans le rappel. Deux articles sur ce blog: [Vous devez vous en souvenir] (http://blog.niftysnippets.org/2008/04/you-must-remember-this.html) et [Mythical Methods] (http: //blog.niftysnippets .org/2008/03/mythical-methods.html) Le second est probablement plus ciblé pour ce que vous essayez de faire. –

Questions connexes