定时任务

ℹ️INFO

框架提供了替代原生 setInterval / setTimeout 的定时任务 API,由框架统一管理生命周期。插件卸载或热重载时,所有关联的定时任务会自动清理,避免内存泄漏。

基础用法

setInterval

替代原生 setInterval,注册周期性定时任务。

src/index.ts
import { setInterval, clearInterval } from 'alemonjs'

// 每 5 秒执行一次
const id = setInterval(() => {
  console.log('tick')
}, 5000)

// 手动取消
clearInterval(id)

setTimeout

替代原生 setTimeout,注册一次性延迟任务。执行完成后自动清理。

src/index.ts
import { setTimeout, clearTimeout } from 'alemonjs'

// 10 秒后执行一次
const id = setTimeout(() => {
  console.log('done')
}, 10000)

// 提前取消
clearTimeout(id)

setCron

注册 cron 表达式定时任务,基于 cron 库实现。

src/index.ts
import { setCron, clearInterval } from 'alemonjs'

// 每天早上 8 点执行
const id = setCron('0 8 * * *', () => {
  console.log('good morning')
})

// 取消 cron 任务
clearInterval(id)

Cron 表达式格式 (5 位):

┌────────────── 分 (0-59)
│ ┌──────────── 时 (0-23)
│ │ ┌────────── 日 (1-31)
│ │ │ ┌──────── 月 (1-12)
│ │ │ │ ┌────── 周 (0-7, 0和7都是周日)
│ │ │ │ │
* * * * *

常用示例:

表达式含义
* * * * *每分钟
0 * * * *每小时整点
0 8 * * *每天早上 8 点
0 0 * * 1每周一凌晨
0 0 1 * *每月 1 号凌晨
*/5 * * * *每 5 分钟

暂停与恢复

src/index.ts
import { setInterval, pauseSchedule, resumeSchedule } from 'alemonjs'

const id = setInterval(() => {
  console.log('working')
}, 3000)

// 暂停
pauseSchedule(id)

// 恢复
resumeSchedule(id)

查看任务列表

src/index.ts
import { listSchedule } from 'alemonjs'

// 列出所有定时任务
const all = listSchedule()

// 按插件名过滤
const mine = listSchedule('my-plugin')

返回值包含 idtypestatusmscronappNamecreatedAt 等字段。

自动清理

框架通过 Error().stack 自动识别调用者所属的插件目录。

  • 插件内调用 — 任务自动关联到该插件。插件卸载时,所有关联任务自动取消。
  • 插件外调用 — 任务归属为 main,不受单个插件卸载影响。
src/index.ts
import { defineChildren, setInterval } from 'alemonjs'

export default defineChildren({
  onCreated() {
    // 无需手动清理,插件卸载时框架自动取消
    setInterval(() => {
      console.log('auto cleanup on unload')
    }, 10000)
  }
})

API 总览

函数说明
setInterval(callback, ms)周期定时任务,返回任务 ID
setTimeout(callback, ms)一次性延迟任务,返回任务 ID
setCron(expression, callback)cron 表达式任务,返回任务 ID
clearInterval(id)取消定时任务
clearTimeout(id)取消定时任务
pauseSchedule(id)暂停任务
resumeSchedule(id)恢复任务
listSchedule(appName?)列出任务