2016-03-09 52 views
2

我在JavaScript中定義這個類:JavaScript的遞歸的setTimeout

function Signal(lbl, ho, tag) { 
    this.lbl = lbl; 
    this.ho = ho; 
    this.tag = tag; 
    this.getstatus = function() { 
     if (this.ho) { 
      $.get('/get.cgi?' + this.tag + '=?0', function (data) { 
       console.log(data); 
       setTimeout(this.getstatus, 1000); 
      }); 
     } 
    }; 
} 

的getStatus一旦被調用,它應該開始自稱與setTimout,但它不會!它只能使用一次。

如果我使用沒有類的函數,它的工作原理!

請幫我一把。

謝謝!

+1

不好用的'this'嘗試把像'無功自我= this'的權利,如果打開後,然後調用'self.getstatus' –

+0

在一個迂腐的音符,JavaScript沒有類..擁抱原型的自由! – Sebivor

回答

3

問題是當getStatus由定時器,this該方法並不是指在對象內部調用,則可以使用bind()this用於傳遞自定義值。另請注意,在ajax回調中,this引用了ajax設置對象。

function Signal(lbl, ho, tag) { 
    this.lbl = lbl; 
    this.ho = ho; 
    this.tag = tag; 
    this.getstatus = function() { 
     if (this.ho) { 
      var signal = this; 
      $.get('/get.cgi?' + this.tag + '=?0', function (data) { 
       console.log(data); 
       setTimeout(signal.getstatus.bind(signal), 1000); 
      }); 
     } 
    }; 
} 
+1

我喜歡使用比「self」(或「that」)更具表現力的名稱,在這種情況下,* signal *看起來很合適,所以'var signal = this'和'signal.getstatus.bind(signal)'所以它很清楚這個*是什麼。正確的* thisArg *也可以使用'setTimeout(function(){signal.getstatus()},1000)'來設置。 – RobG

+0

@RobG:'信號'可以是任何*信號。 「自我」(按照慣例)意味着當前的情況。通常代碼不夠朦朧,不清楚哪個(多個實例)的含義。 – Bergi

+0

@ Bergi-類似地,* self *可以是任何東西,使用* signal *(或任何* this *是一個實例)只是提示它是什麼。 * self *可能適用於可能在* this *處使用不同「對象類」調用的方法。 – RobG