1. 程式人生 > >用node-schedule進行定時任務的管理

用node-schedule進行定時任務的管理

1.初衷

因為遊戲中總是會用到一些比如某年某月某日進行某項任務的情況,或者說,每天的某個時間進行某項設定,等等這些和時間密切相關的任務。我們知道nodejs中其實都是使用setTimeOut()這個函式去處理的,但是如果到處使用settimeout,是一種讓人很瞧不起的程式編寫方式,於是在GitHub上找到第三方庫 node-schedule可以供我們使用。

2. 大致原理

該庫使用簡單,我也閱讀過原始碼,也是利用setTimeOut和event事件進行管理,對所有加入的事件進行排序,並且計算當前時間和最近一個事件發生時間的時間間隔,然後呼叫setTimeOut設定回撥。總的來說分兩種事件,一種是一次性的,一種是週期性的,一次性任務呼叫完就結束,週期性的會不斷地迴圈呼叫,當一個週期性事件被呼叫後,會根據週期生成下一個週期任務,並新增到任務列表中,重新排序。每個任務呼叫結束,都會計算並準備下一個任務。

3.使用舉例

該庫的使用其實Github上,或者是下載後的README.md檔案已經講的比較清楚了,不過我還是把我的使用例子拿出來囉嗦一下。

        var rule = new schedule.RecurrenceRule();
        rule.hour = 0;
        rule.minute = 1;
        var j = schedule.scheduleJob(rule, func1);

        上例使用的是迴圈,值得注意的一點是,每個任務需要單獨new一個schedule.RecurrenceRule物件,不能公用。另外就是一點網上提的比較少的一點,如果我們對迴圈中的時間成員沒有設定,說明我們對其不感興趣,如上例,我們沒有設定日期中“天”,那麼會以天為單位進行迴圈,每天的0點,1分呼叫func1函式。原始碼中,未設定的時間成員為null,迴圈結構的匹配採用的是從分鐘開始的逐步累加,如果發現某成員是null,那麼就直接匹配,如果不是null,就從0開始,逐漸累加,知道完全匹配。