如何用变量设置node-cron定时表达式并按用户地址管理定时任务
变量不生效问题修复
你传入参数失败的核心原因是用单引号包裹了模板字符串,ES6 中需要用反引号()包裹内容才能正常解析 ${变量} 语法。同时要注意 node-cron 的 cron 表达式参数顺序为:[秒(可选)] 分 时 日 月 星期`,你要匹配自己的执行规则调整参数顺序,比如要实现「每 Int 个月的 Day 号 Hour 点 Minute 分执行」,表达式写法如下:
// 注意用反引号包裹 const cronExp = `${Minute} ${Hour} ${Day} */${Int} *`
定时任务按地址覆盖实现
你的需求是同地址新规则覆盖旧规则,不需要给每个地址存数组,直接让 cron_map 每个键(用户地址)对应单个 cron 实例即可,每次新增任务前先停止旧任务再替换,避免旧任务后台残留执行。
修正后的完整代码参考:
// 初始化存储对象,每个地址对应唯一cron实例 const cron_map = {}; MSetCron_Map = async(Add, Am, Int) => { const {Day, Hour, Minute} = this.state; // 先停止同地址的旧任务,避免残留 if (cron_map[Add]) { cron_map[Add].stop(); } // 生成新的cron任务,注意模板字符串用反引号 const newCronTask = cron.schedule(`${Minute} ${Hour} ${Day} */${Int} *`, () => { this.SharedWallet.methods.ReloadAllowance(Add, Am).send({from: this.accounts[0]}, (err, success) => { if(err) return console.log('Reload failed in Solidity'); if(success) this.SharedWallet.methods.PayOut(Add, Math.round(Am)).send({from: this.accounts[0]}); }); console.log('running a task every '+Int+' months'); }, { scheduled: true, timezone: "EST" }); // 覆盖存储新任务 cron_map[Add] = newCronTask; }
额外注意点
你原来的 Solidity 调用回调用了普通 function 声明,会丢失外层 this 指向,上面代码里已经换成了箭头函数,确保可以正常访问 this.SharedWallet、this.accounts 等属性。
内容的提问来源于stack exchange,提问作者millbird
相关产品推荐
相关产品推荐

