2013-08-15 13 views
5

Ecco uno fiddle.Chiama il metodo JavaScript dell'oggetto con SetInterval()

Sto cercando di creare un oggetto di conto alla rovescia che utilizza moment.js (un plugin che preferisco rispetto all'utilizzo di Data())

var Countdown = function(endDate) { 
    this.endMoment = moment(endDate); 

    this.updateCountdown = function() { 
     var currentMoment, thisDiff; 

     currentMoment = moment(); 
     thisDiff = (this.endMoment).diff(currentMoment, "seconds"); 

     if (thisDiff > 0) 
      console.log(thisDiff); 
     else { 
      clearInterval(this.interval); 
      console.log("over"); 
     } 
    } 

    this.interval = setInterval(this.updateCountdown(), 1000); 
} 

Ho quindi creare un'istanza del conto alla rovescia in questo modo:

var countdown = new Countdown("January 1, 2014 00:00:00"); 

Tuttavia, la funzione sembra funzionare una volta sola. Qualche idea? Dovrei usare setTimeout() invece?

+1

provare 'this.updateCountdown' nella chiamata a' setInte rval'. – fbynite

+0

che non sembra fare riferimento all'oggetto (genera un errore 'Impossibile chiamare il metodo' diff 'di undefined): http://jsfiddle.net/zCFr5/2/ – dougmacklin

+0

È necessario fare qualcosa come questo http: // jsfiddle .net/zCFr5/3/ – fbynite

risposta

3

È possibile memorizzare la this contesto come variabile locale come la seguente:

var Countdown = function(endDate) { 
    var self = this; 
    this.endMoment = moment(endDate); 

    this.updateCountdown = function() { 
     var currentMoment, thisDiff; 

     currentMoment = moment(); 
     thisDiff = (self.endMoment).diff(currentMoment, "seconds"); 

     if (thisDiff > 0) 
      console.log(thisDiff); 
     else { 
      clearInterval(self.interval); 
      console.log("over"); 
     } 
    } 

    this.interval = setInterval(this.updateCountdown, 1000); 
} 

Oppure si può semplicemente utilizzare le variabili direttamente come ad esempio:

var Countdown = function(endDate) { 
    var endMoment = moment(endDate); 

    this.updateCountdown = function() { 
     var currentMoment, thisDiff; 

     currentMoment = moment(); 
     thisDiff = (endMoment).diff(currentMoment, "seconds"); 

     if (thisDiff > 0) 
      console.log(thisDiff); 
     else { 
      clearInterval(interval); 
      console.log("over"); 
     } 
    } 

    var interval = setInterval(this.updateCountdown, 1000); 
} 

Io preferisco il secondo approccio - fiddle

9

È necessario passare un riferimento alla funzione, non il risultato della sua esecuzione. Inoltre, hai bisogno di qualche "magia" aggiuntiva per chiamare un metodo in questo modo.

var me = this; 
this.interval = setInterval(function() { 
    me.updateCountdown(); 
}, 1000); 
+0

Invece di salvare un riferimento a 'this', puoi usare' Function.bind'. http://stackoverflow.com/a/6065221/139010 –

+0

Sì, ma non funziona nei browser più vecchi. E nessun quadro per quello implicato in questione. – kirilloid

+0

Non sembra funzionare ancora, ecco il fiddle aggiornato: http://jsfiddle.net/zCFr5/1/ – dougmacklin

Problemi correlati