阅读 393

在 Deno 中设置 CronJob | 七日打卡

群里的大佬已经在探讨"Deno 是一个迈向错误方向的 JavaScript 运行时"了,而我,多年经验的Copy攻城狮,依旧只能看懂些边边角角的知识点,然后分享出来还被大佬批得体无完肤。无奈,以目前Copy攻城狮对JavaScript的掌握程度,也只配 API 调用师的水准。有的人一出生就是王者;有的人从青铜一步一步"迈向CEO赢取白富美走向人生巅峰";有的人同样是青铜,十年以后还是青铜,“慢进则退”,一步一步沦落到“癫疯人生”。废话太多,还是先看看 Deno 中的 CronJob 如何写"Hello World".

什么是 CronJob

CronJob即定时任务,就类似于Linux系统的crontab,在指定的时间周期运行指定的任务。比如小明每天晚上都会问候她异地的女朋友并送温暖,比如“铝盆友彩虹屁 bot”遇上 Deno定时发送邮件就依赖于 Serverless平台提供的周期触发函数功能,再比如在一些服务编排脚本中时常能看到诸如schedule: "*/1 * * * *",也许这就是 CronJob。本质上CronJob是一个调度程序,使应用程序可以调度作业在特定日期或时间自动运行。今天,我们将把CronJob集成到Deno应用程序中,有兴趣看看吗?

安装 Deno

前面的文章中基本都没有提及 Deno 的安装,在国内,我们使用 "vscode-deno 之父“JJC大佬为我们提供的镜像服务进行安装,地址为https://x.deno.js.cn/,简单的安装教程如下:

# 安装最新版
## 使用 Shell:
curl -fsSL https://x.deno.js.cn/install.sh | sh

## 使用 PowerShell:
iwr https://x.deno.js.cn/install.ps1 -useb | iex

# 安装某个特定版本
## 使用 Shell:
curl -fsSL https://x.deno.js.cn/install.sh | sh -s v1.0.0

## 使用 PowerShell:
$v="1.0.0"; iwr https://x.deno.js.cn/install.ps1 -useb | iex

# 验证安装
deno --help
复制代码

deno_cron

目前deno官方第三方插件库中关于cron的库有3条,其中deno_cron目前 35星。deno_cron 是一个在Deno中使用的智能cron作业调度程序库,它使您可以编写具有大量灵活性的可读cron语法。对于许多开发人员而言,编写cron语法和操作可能非常繁琐。这个插件提供了非常友好的开发人员api,可以编写所需的任何作业计划程序的cron语法。

可通过以下方法引入:

import {cron, daily, monthly, biweekly, weekly, hourly, every15Minute, everyMinute, start, stop } from 'https://deno.land/x/deno_cron/cron.ts';
复制代码

细心的朋友可能直接去读源码了,核心包括大量空行大概168行,这不禁让我们想起了npm包is-promise,这个只有两行代码的包的周下载量接近千万次,但愿同样的事情不会再复现!

我们可以使用 cron 在Deno中定义自定义时间表,如:

cron('* * * * * *', () => {
    // run some task
});

# 其中
*    *    *    *    *    *
┬    ┬    ┬    ┬    ┬    ┬
│    │    │    │    │    │
│    │    │    │    │    └ 星期 (0 - 7) (0 或者 7 is 星期日)
│    │    │    │    └───── 月 (1 - 12)
│    │    │    └────────── 日 (1 - 31)
│    │    └─────────────── 时 (0 - 23)
│    └──────────────────── 分 (0 - 59)
└───────────────────────── 秒 (0 - 59) - [可选 默认 01]
复制代码

这些星号是用来做什么的呢?

  • 第一个星号占用秒数。取值范围为0-59
  • 第二个星号使用分钟数,并且取值范围为0-59
  • 第三个星号使用小时数,其值介于0-23之间
  • 第四个星号为月份中的一天,其值在1-31之间
  • 第五个星号为一年中的月份,其值在1-12之间
  • 第六个星号是星期几,取值范围是0-7

例如每隔一秒打印信息和i++的值:

import { cron } from 'https://deno.land/x/deno_cron/cron.ts';

let i = 0;
cron('*/1 * * * * *', () => {
    // run some task
    console.log('This is a same thing', i++)
});
复制代码

deno cron

当然,除了设置 * , 我们还可以调用其他api,如使用everyMinute执行每分钟的任务:

import { everyMinute } from 'https://deno.land/x/deno_cron/cron.ts';

everyMinute(() => {
    console.log(new Date())
})
复制代码

deno cron

此外还可以调用 start() 和 stop() 两个方法分别启动和停止所有的 cronjob:

import { cron, start,stop } from 'https://deno.land/x/deno_cron/cron.ts';
let i = 0;
cron('*/1 * * * * *', () => {
    // run some task
    console.log('This is a same thing', i++)
    if (i != 5) {
        start()
    } else {
        console.log('Stop!')
        stop()
    }
});
复制代码

deno cron

小结

在 deno 中使用 cron,您学废了吗?今天的分享就到这里,希望大家感兴趣的话可以看看源码,如果对您有启发欢迎评论区和我探讨,如有不足之处,欢迎批评指正!

github.com/rbrahul/den…