2016-10-20 9 views
1

毎分更新したい時刻計算機があります。私は、各タイムゾーンの時間を計算する特別な関数を作った ですが、setTimeout()を使って関数manualTime();を呼び出すと、solveTime()が呼び出されないようです。 (私は2つの関数を使用しなかったときに働いていました) JS関数はsetIntervalで呼び出されたときに現在時刻で更新されません。

編集:関数が呼び出されたときに関数が更新されていないことがわかりました。何らかの理由で最初にロードされた時刻を常に返します。

var masterTimeUTC = new Date(); //these need to be global for the solveTime to work 
    var utcHours = masterTimeUTC.getUTCHours(); 
    var utcMinutes = masterTimeUTC.getUTCMinutes(); 
    var utcSeconds = masterTimeUTC.getUTCSeconds(); 
    var utcMinutesLead = masterTimeUTC.getUTCMinutes(); 

function manualTime() { 
    //the main show 
    var masterTimeLocal = new Date(); //this contains everything, so we can mess with it more 
    var localhours = masterTimeLocal.getHours(); 
    var localminutes = masterTimeLocal.getMinutes(); 
    var localseconds = masterTimeLocal.getSeconds(); 
    //get all the relvant info for this stuff 
    if (localminutes < 10) { 
     localminutes = "0" + localminutes; 
    } 
    if (localseconds < 10) { 
     localseconds = "0" + localseconds; 
    } 
    if (localhours < 10) { 
     localhours = "0" + localhours; 
    } //make it look nice 
    //solve times based on utc codes 
    solveTime(0);//utc 0 
    solveTime(-7); //west 
    solveTime(-6); //mountain 
    solveTime(-5); //central 
    solveTime(-4); //east 
    solveTime(1); //uk 
    solveTime(8); //perth 
    solveTime(9); //adelaide 
    solveTime(10); //sydney 
    //use the solveTime function to solve for times. syntax is x 
    // x is the utc modifier, it can be any number incl. negatives 
    document.getElementById("clocksingle").innerHTML = localhours + ":" + localminutes + "." + localseconds; 
    //set the big time on top. 
    setTimeout(manualTime, 1000); 
    //run this every second to simulate a real clock 
} 


function solveAll() { 
    manualTime(); 
    solveTime(-7); 
    solveTime(-6); 
    solveTime(-5); 
    solveTime(-4); 
    solveTime(0); 
    solveTime(8); 
    solveTime(9); 
    solveTime(10); 
} 
//solveTime 
//this will handle everything, including am, pm, printing to div, whatever 
//the div name is whatever the utc modifier is 
function solveTime(x) { 
    if (x < 0) { 
     var shift = 24 + x; 
    } else { 
     var shift = x; 
    } 

    var suffixSolve = (utcHours + shift) % 24; 
    var suffix = "am"; 
    if (suffixSolve > 12) { 
     suffix = "pm"; 
    } 
    if (utcMinutes == 0) { 
     utcMinutesLead = "00"; 
    } 
    if (utcMinutes < 10) { 
     utcMinutesLead = "0" + utcMinutes; 
    } 
    var timeSolve = (((utcHours + x) + 11) % 12 + 1); 
    var timeTotal = timeSolve + ":" + utcMinutesLead + " " + suffix; 
    var utcMod = x; 
    if (utcMod > 0) { 
     utcMod = "+" + utcMod; 
    } 
    if (x === 0){ 
     document.getElementById(x).innerHTML = timeTotal; 
    } 
    else { 
    document.getElementById(x).innerHTML = "(UTC" + utcMod + ") " + timeTotal; 
    } 
} 

window.onload = function() { 
    setTimeout(1000); 
    manualTime(); 

} 

window.onload = function() { 
    setTimeout(60000); 
    solveAll(); 
} 

以下

コード編集:私はsolveTime機能にいくつかのコンソール出力を追加

、それはあらゆる秒(setTimeoutをのおかげで)実行しているように見えるが、それはある時刻を更新されていませんから解決する。関数内にnew Date()を追加しようとしましたが、それも機能しません。

EDIT2:

これは重複しない、関数が細かいと呼ばれています。関数を再実行するたびに、関数内の時間は更新されません。

+2

はあなたの質問ではなく、あなたのサイト上で、それへのリンクであなたのコードを投稿してください。 – Pat

+0

私は質問にコードを追加しました – mark

+0

@marketが本当に必要とする関数は 'setInterval'なので、 'setTimeout()'関数を呼び出すのに重複してマークしてはいけません。 – dperish

答えて

2
window.onload = function() { 
    setTimeout(function(){ 
     manualTime(); 
    ),1000); 
} 

window.onload = function() { 
    setInterval(function(){ 
     solveAll(); 
    ),60000); 
} 
+0

これは実際には問題ありません(時間を更新しない機能は最初に読み込まれたときのみ時間を使用します) – mark

1

setTimeoutは非同期操作であり、同期コードのような実行をブロックしません。

setTimeout(1000); 
manualTime(); // <-- this runs immediately after, not after 1000ms 

setTimeoutの最初の引数はコールバック関数で、ミリ秒単位の時間は2番目の引数です。コールバック関数は、時間の終了直後に呼び出されます(at the minimum)。

setTimeout(manualTime, 1000); 

同じことをsolveAllために:、あなたにもwindow.onload内のコード内で直接コールバックを渡す必要がありますmanualTime()の終わりのように、あなたがやったよう

あなたは、単一のonloadハンドラ内ですべてを置くことができます。また、分離のための必要はありません。

window.onload = function() { 
    setTimeout(manualTime, 1000); 
    setTimeout(solveAll, 60000); 
} 
+0

この結果は 'eval'となり、推奨されません。 – dperish

+0

@dperishどういう意味ですか? 'eval'はどこにも呼び出されません。 – nem035

+0

これを参照してください:http://stackoverflow.com/questions/8058996/why-does-calling-settimeout-with-parenthesis-not-start-a-new-callstackまたはこれ:http://e.epubbud.com/read.php?g=54B6SAEK&p=77 – dperish

関連する問題