跳到主要内容

触发选项

trigger()triggerAndWait() 的第二个参数支持丰富的触发选项。

延迟执行

// 延迟 5 秒执行
await myTask.trigger(payload, { delay: 5000 });

// 延迟 10 分钟执行
await myTask.trigger(payload, { delay: '10m' });

delaySafe 能力可用时(有持久化存储),延迟通过 ScheduleClock 持久化轮询实现——即使 tab 刷新也不会丢失。否则降级为 setTimeout

重试配置

const myTask = rxdb.trigger.task({
id: 'my-task',
retry: {
maxAttempts: 5, // 最大重试次数(含首次执行)
factor: 2, // 退避因子
minTimeoutInMs: 1000, // 最小退避间隔
maxTimeoutInMs: 30000, // 最大退避间隔
randomize: true // 随机抖动
},
run: async (payload, ctx) => {
/* ... */
}
});

每次失败后,延迟时间按指数退避计算:min(minTimeout * factor^attempt, maxTimeout)

幂等键

防止重复触发同一任务:

await myTask.trigger(payload, {
idempotencyKey: `order-${orderId}`
});

相同幂等键在保留期内(默认 14 天)只会创建一个 Run。

并发控制

队列级并发

在 task 定义时设置队列并发上限:

const myTask = rxdb.trigger.task({
id: 'sync-data',
queue: { name: 'sync', concurrencyLimit: 1 },
run: async (payload, ctx) => {
/* ... */
}
});

并发键

同一 concurrencyKey 的任务同时只允许一个执行:

await myTask.trigger(payload, {
concurrencyKey: `user-${userId}`
});

超时控制

const myTask = rxdb.trigger.task({
id: 'long-task',
maxDuration: 60_000, // 60 秒超时
run: async (payload, ctx) => {
// 通过 ctx.signal 监听取消
const res = await fetch(url, { signal: ctx.signal });
return res.json();
}
});

超时后 Run 状态变为 TIMED_OUT

TTL

为单次触发设置过期时间:

await myTask.trigger(payload, {
ttl: '1h' // 1 小时后过期(若仍未执行)
});

QUEUED 或 DELAYED 状态的 Run 超过 TTL 后被标记为 EXPIRED

标签与元数据

await myTask.trigger(payload, {
tags: ['priority:high', 'source:webhook'],
metadata: { correlationId: 'abc-123' }
});

标签和元数据在 RunInfo 中可查询,便于分类和追踪。

持久化策略

控制敏感数据的存储方式:

const sensitiveTask = rxdb.trigger.task({
id: 'process-payment',
persistencePolicy: 'metadata-only', // 'full' | 'metadata-only' | 'none'
run: async (payload, ctx) => {
/* ... */
}
});
策略payload/output 落盘DevTools 可见
full
metadata-only
none不持久化

批量触发

一次性触发多个相同任务的 Run:

const batch = await myTask.batchTrigger([
{ payload: { id: 1 } },
{ payload: { id: 2 }, options: { delay: 5000 } },
{ payload: { id: 3 } }
]);

console.log('Batch ID:', batch.batchId);
console.log('Run 数量:', batch.runs.length);

批量写入使用 saveMany(30) 分块,避免大事务阻塞。