2016-10-24 5 views
1

私は、メソッドが再帰的に呼び出す必要があり、setImmediateを介して非同期に呼び出さなければならない状況があります。'this'はsetImmediateコールで失われますか?

次のコードは元のものとは関係ありませんが、同じ「問題」が発生します。「この」参照は2回目の呼び出しで失われているようです。

私は次の出力は、「this.someMethod」は、いくつかの点で、関数で停止したところで、私はそれを理解していないよ持って
function A() { 
    this.some_message = 'Index is: '; 
} 

A.prototype.someMethod = function (index) { 
    console.log(`${this.some_message} ${index}`); 
    setImmediate(this.someMethod, index + 1); 
} 

> new A().someMethod(1) 
Index is: 1 
undefined 
> undefined 2 
TypeError: "callback" argument must be a function 
    at exports.setImmediate (timers.js:664:11) 
    at Immediate.A.someMethod (repl:3:1) 
    at runCallback (timers.js:639:20) 
    at tryOnImmediate (timers.js:610:5) 
    at processImmediate [as _immediateCallback] (timers.js:582:5) 
> 

私は変更することによって、それを解決しましたメソッドの最後の行に:

setImmediate(this.someMethod.bind(this), index + 1); 

しかし、私はなぜsetImmediateがそのように振る舞うか分かりません。誰も私にそれについてのリンクを提供することはできますか?私は本当にどんな助けにも感謝します。私はその答えを見つけようとしていて、数時間もしてきました。前もって感謝します。

- 編集:また、より良いタイトルや修正をお勧めします。私は英語レベルがかなり低いです。

+2

読む:そのためhttps://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout#The_this_problem – epascarello

+0

おかげで...私は間違った方法で探していました! –

答えて

3

高次関数を使用している場合はいつでも、となります。 3つのオプションがあります:thisへの参照をクロージャーに格納する、渡す関数をバインドする、またはthisを使用しないでください。

// using Function.prototype.bind 
var foo = { value: 3 }; 
foo.method = function() { return this.value }; 

function doesAsync() { 
    setImmediate(foo.method.bind(foo)); 
} 

// using a closure 
var bar = { 
    value: 3, 
    method: function() { 
    var self = this; 
    setImmediate(function() { 
     alert(self.value); 
    }); 
    } 
}; 
+0

私はいつも "これ"を避けます...しかし、今回は、私は..できません。ありがとう:) 私は、setImmediateが別のコンテキストから実行されているという事実を見逃しています。 –

+1

@EmilioGrisolía。それは残念なことに、メソッドを引数として渡すたびに発生します。私も 'これを避けようとするが、私はまた、生計のためにGoogleマップのアプリを書く:) –

関連する問題