2017-07-25 128 views
0

我需要一個函數來初始運行,然後在下午12點和上午12點重新運行。如果有任何影響,我使用VueJS。設置每12小時的時間間隔

fetch_datetime() 
{ 
    axios.get('/api/core/datetime').then((response) => { 
     this.datetime = response.data; 
     this.set_interval(); 
    }); 
}, 

set_interval() 
{ 
    var current_date = new Date(); 
    var hours = current_date.getHours(); 
    var minutes = current_date.getMinutes(); 
    var seconds = current_date.getSeconds(); 
    if(hours == 12 && minutes == 0 && seconds == 0 || hours == 0 && minutes == 0 && seconds == 0) 
    { 
     this.fetch_datetime(); 
    } else 
    { 
     if(hours >= 12) 
     { 
      setTimeout(this.fetch_datetime, (1000 * (60 - seconds) * (60 - minutes)) + (1000 * 60 * (24 - hours - 1) * 60)); 
     } else 
     { 
      setTimeout(this.fetch_datetime, (1000 * (60 - seconds) * (60 - minutes)) + (1000 * 60 * (12 - hours - 1) * 60)); 
     } 
    } 

但是,這不是按預期方式工作,並且該功能運行得很早,然後在小時內運行多次。

+3

誰將打開瀏覽器12小時後再次運行該功能? – Pete

+0

這個想法是,如果用戶在11:50訪問該站點,該功能需要在12:00重新運行。 – Imagine17

+1

更好的問題是:Imagine17真的等了12個小時,看看它是否有效:D – SkryptX

回答

1

這是一個非常簡單的功能,可以做你想做的事情。它應該適合你的用例(幾分鐘後刷新),但不要指望它在瀏覽器更改上具有很強的適應性。

// Takes an array of hours as number and a function to execute 
 
function executeOnHours(hours, callback) { 
 
    callback(); // First, execute once 
 
    let now = new Date(); 
 
    const hoursWithToogle = hours.map(h => { 
 
    return { 
 
     value: h, 
 
     executedToday: now.getHours() === h // Don't run now if already on the given hour 
 
    } 
 
    }); 
 
    setInterval(() => { 
 
    now = new Date(); 
 
    const triggers = hoursWithToogle.filter(h => { 
 
     if (!h.executedToday && h.value === now.getHours()) { 
 
     return h.executedToday = true; 
 
     } else if (h.value !== now.getHours()) { 
 
     h.executedToday = false; // Clean the boolean on the next hour 
 
     } 
 
    }); 
 
    if (triggers.length) callback(); // Trigger the action if some hours match 
 
    }, 30000); // Fix a precision for the check, here 30s 
 
} 
 

 
executeOnHours([0, 12], function() { 
 
    console.log('Something is done'); 
 
});

如果你正在尋找一個更強大的解決方案,你也可以使用later.js,聲稱能在瀏覽器中運行,並提供一個全功能的cron接口,在集束大小的成本。

+0

@ Imagine17請注意,我的代碼中存在拼寫錯誤(第一次getHours上缺少括號)。 – Cobaltway

0

我會首先計算到下一個上午12點/下午的距離,第一次運行後您可以在每次通話中添加12小時或創建間隔。

要獲得的距離,你可以使用的Date.now差和時刻運行第一次運行:

var n = new Date() 
if(n.getHours()>=12){ 
    n.setHours(24); 
}else{ 
    n.setHours(12); 
} 

在此之後將所有小單位一個多小時到零。

初始呼叫後: setInterval(this.fetch_datetime, 12 * 60 * 60 * 1e3)

還有一個VUE插件,它提供了時間間隔和回調https://www.npmjs.com/package/vue-interval

您還應該記住的setTimeout和setInterval都沒有絕對正確的幫助。他們可能會提早或延遲觸發幾毫秒。因此,計算與下一個執行時刻的差異可以觸發函數double。