2010-10-02 7 views
2

Я пытаюсь реализовать асинхронную очередь метода в JavaScript, как показано в this blog postАсинхронный очередь метод Javascript

Вот что я до сих пор:

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); 

Я не могу показаться, чтобы получить его работа как рекламируется, хотя код выглядит правильно для меня. Когда я вызываю функцию флеша, я получаю this._methods is undefined на линии while (this._methods[0]) {.

ответ

3

Как вы используете? Если вы делаете:

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

... вы не должны получать эту ошибку, и я не: http://jsbin.com/iduji3

+0

Да, я использую его в качестве конструктора. Вот что странно. –

+0

Хорошо, похоже, была проблема с тем, как я использовал Queue # flush в качестве обратного вызова. Он работает нормально. –

+0

@Adam: Ах, если вы использовали его как * обратный вызов *, ваша проблема заключалась бы в том, что 'this' не будет тем, чего вы ожидаете в обратном вызове. Два сообщения в блоге об этом: [Вы должны помнить об этом] (http://blog.niftysnippets.org/2008/04/you-must-remember-this.html) и [Мифические методы] (http: //blog.niftysnippets .org/2008/03/mythical-methods.html) Второй, вероятно, больше нацелен на то, что вы пытаетесь сделать. –