2016-04-28 9 views
7

Sto provando a decrementare una variabile una volta al giorno. Ho scritto il seguente codice per questo.Decrementa una variabile una volta al giorno - Javascript

var counter = 10; //any value 
 

 
setInterval(function() { 
 

 
    counter = counter - 1; 
 

 
}, 86400000);

Esiste un modo migliore o efficace per ottenere la stessa cosa?

P.S: - Non desidero utilizzare alcuna libreria.

+1

Hmm? Che biblioteca? Il tuo codice attuale non utilizza nessuno ... – Jeroen

+1

Volevo solo sapere se esiste un modo migliore per scrivere questo codice? In questo modo migliore, non voglio usare alcuna libreria come il momento. Questo è quello che intendevo. Scusa per la lac chiarezza –

+0

@Jeroen probabilmente vuole un modo migliore per risolvere questo problema, senza usare una libreria. Non sta dicendo che ne sta usando uno ora, solo che non vuole la soluzione :-) –

risposta

1

L'unica cosa che ti manca è impostare il valore iniziale della variabile counter.
vorrei scrivere:

var counter = 1000; // or any useful value 

setInterval(function() { 
    --counter; 
}, 24 * 60 * 60 * 1000); // this is more self-explanatory than 86400000, and, being evaluated just once, it will have a tiny effect on the performace of the script 
+0

Grazie per la parte 24 * 60 * 60 * 1000. –

+0

:-) Suppongo che la chiarezza sia preferibile alla velocità (quando il guadagno di velocità è così infinitesimale). – MarcoS

2

Non vedo alcun problema nel modo in cui lo scrivi. Usa intervallo, ok, ma questo non è il peggiore male che puoi fare per impostare il valore della variabile.

Si può pensare ad un'altra soluzione con una funzione che restituisce il contatore corrente.

var initialValue = 20000; 

function getCounter() { 
    return initialValue - Math.floor(Date.now()/1000/60/60/24); 
} 

console.log(getCounter()); 

La differenza è che il numero del giorno corrente inizia dall'ora di inizio UNIX. Ogni giorno il numero del giorno sarà aumentato, quindi il risultato della funzione sarà diminuito di 1.

Ma ancora non vedo come questa soluzione possa essere migliore della tua.

0

Non sono del tutto sicuro del perché, ma l'utilizzo di setInterval mi fa sentire a disagio.

Se dovessi richiedere questo, vorrei usare qualcosa di simile a questo approccio:

var counter = 10; 
var timeout = new Date(); 
setInterval(function(){ 
    if(new Date() >= timeout) 
    { 
    --counter; // the action to perform 
    timeout = new Date(timeout.getTime() + 86400000); // update the timeout to the next time you want the action performed 
    } 
    console.log(counter); 
},1000); // every second is probably way more frequent than necessary for this scenario but I think is a decent default in general 

Una cosa che questo permette è quello, ad esempio, impostare il timeout successivo alla mezzanotte di domani piuttosto che essere bloccato in a "X secondi dall'esecuzione precedente". La chiave è l'inversione del controllo - l'azione stessa può ora dettare quando dovrebbe essere eseguita la prossima volta.

Anche se probabilmente avrei astratto i dettagli dietro un'interfaccia accettando un avvio, un intervallo e un'azione.

0

magari utilizzare window.localStorage per salvare l'ultima volta, e se è maggiore di 60 * 60 * 24 (secondi in un giorno) Impostare l'ultima volta a questa mattina/ora/1: 00 e quindi ridurre il valore e salvarlo.

Esempio:

var d = new Date(); 
var mins = -(1+d.getHours())*60+d.getMinutes(); 
var secs = mins*60+d.getSeconds(); // total seconds passed today from 1:00 
var now = d.getCurrentTime(): 
var lastCheck = localStorage.getItem("lastCheck"); 
if (!lastCheck) 
{ 
    localStorage.saveItem("lastCheck",now-secs); // beginning of today 
} 
var dayPassed = now - lastCheck > 24*60*60; // change to see if a day has passed 
if (dayPassed) 
{ 
    // save seconds 
    localStorage.setItem("counter",localStorage.getItem("counter")-1); 
    localStorage.saveItem("lastCheck",now-secs); // beginning of today 
} 
0

Il problema più grande ai miei occhi è che devi tenere questo processo uno JS correre costantemente per giorni alla volta di averlo fare quello che ti serve. Il mondo non è così perfetto che le cose non hanno bisogno di un riavvio occasionale ... compreso il processo JS medio.

Personalmente vorrei memorizzare un timestamp del mio punto di partenza, quindi (ogni volta che ho bisogno di sapere quanto tempo è trascorso) prendi un nuovo timestamp e usalo per calcolare quanti giorni è stato. In questo modo, anche se qualcosa interrompe il mio processo, posso ancora essere proprio dove ho iniziato.

-2

Ha più senso controllare quanti giorni sono trascorsi da una data specifica e decrementare quel numero di giorni dal contatore. Principalmente solo perché non mi aspetto che nessuno lasci aperta la stessa pagina senza necessità o voglia di ricaricare per giorni interi. Vorrei fare qualcosa di simile:

counter = 365; // original counter 
var start = new Date(2016, 03, 20); // original date 
var now = new Date(); 
var days = Math.floor(Math.abs(start.getTime()-now.getTime())/(24*60*60*1000)) 
counter -= days; 

In questo modo ogni volta che si visita la pagina, sarebbe decrementato correttamente. Si noti che questo ignora eventuali problemi con giorni bisestili o fusi orari. L'esempio sopra avrebbe un contatore di 360 per me. E poi se ti aspettavi che fosse aperto per giorni, ricaricalo automaticamente con:

self.setTimeout(function(){document.location.reload()}, 86400000); 
+0

Potrebbe essere un javascript lato server, non una pagina html lato client. – Qwertiy

+0

'now = parseInt (d.getFullYear() + '' + (d.getMonth() + 1) + '' + d.getDate());' - dovrebbe essere sbagliato. – Qwertiy

+0

Cosa intendi con "dovrebbe essere"? Restituisce la data corrente come numero intero, come 2016423. – jdgregson

Problemi correlati