2012-01-10 19 views
-1

コールバックを受け取る関数の単純なキューを実装しようとしています。私の問題は、flushメソッドでは、実行されるアクションが(私の場合はindexedDBの呼び出しで)長時間実行されるものである場合、 "this"がnullであることです。私はこの種の行動を経験したことがないので、何が起こっているのか教えてください。これがnullの場合

ここではコードです:あなたが私たちに与えてくれたものに基づいて

var Queue = (function() { 
    function Queue() { 
    }; 

    Queue.prototype.items = []; 
    Queue.prototype.results = []; 
    Queue.prototype.add = function (action) { 
     this.items.push(action); 
    }; 
    Queue.prototype.complete = function() { }; 
    Queue.prototype.flush = function() { 
     var args = Array.prototype.slice.call(arguments); 
     if (args.length > 0) { this.results.push(args); } 
     if (this.items.length > 0) { 
      var action = this.items.shift(); 
      action.call(this); 
     } else { // Complete, call back multi. 
      var results = this.results; 
      this.clear(); 
      this.complete(results); 
     } 
    }; 
    Queue.prototype.clear = function() { 
     this.items = []; 
     this.results = []; 
    }; 

    Queue.create = function() { 
     return new Queue; 
    }; 

    return Queue; 
})(); 
+3

どちらの行ですか? 「これは何だと思いましたか?それは何の代わりになったのですか?無関係のビットを削除して、問題の範囲を5〜6行に絞り込みます(ただし、削除するだけではなく、削除の周りをリファクタリングする必要があります)。 –

+0

@LightnessRacesinOrbitフラッシュメソッドの内部。私はこれをQueueのインスタンスにすることを期待していましたが、代わりにnullでした。 – Matthew

+0

新しいスコープがあります。 –

答えて

1

私の最高の推測では、それができるように、あなたには、いくつかの非同期関数にQueue.prototype.flush関数オブジェクトへの参照を渡しているということですコールバックとして使用できます。それが本当ならば、flush()はこのように呼ばれている:

function ayncFunction(callback) { 
    // Do some stuff 
    callback(); 
} 
ayncFunction(myQueue.flush); 

を...代わりに、このようなの:関数が個別に呼び出された

myQueue.flush(); 

ので、代わりのオブジェクトに、thiswindow設定されます。 (strict modeを使用している場合を除き、その場合はundefinedです)。

あなたはこのように、機能にmyQueue.flush()への呼び出しをラップすることにより、問題を回避することができます

var myCallback = function() { 
    myQueue.flush(); 
}; 
ayncFunction(myCallback); 

myCallbackmyQueue周りclosureとなりますので、これは動作します。

この問題を解決する別の方法は、関数をそのコンテキスト(つまり呼び出されるオブジェクト)に結びつけるためにbind()を使用することです。

+0

実際、 'this'は' method'の所有者を指します。これは 'window'です。 –

+0

@ライトネス:そうです。私は答えを修正します。 – PPvG

+0

これは何が起こっているのかを正しく解釈したものです。私は最初の方法を試みます。 – Matthew

関連する問題