Node.js中Cron Job内Promise不生效 无法按预期顺序执行代码
问题排查与解决方案
核心问题1:缺失必要变量与依赖
当前代码存在两个基础缺失,直接导致逻辑中断:
- 未引入
node-cron依赖,也未定义cron变量 - 调用
twelvedata(config)时config变量未声明,twelvedata初始化直接抛出同步异常,后续Promise逻辑完全未执行
修复方案:
- 先安装依赖:
npm install node-cron twelvedata - 代码开头补充依赖引入与config配置:
const cron = require('node-cron'); const twelvedata = require("twelvedata"); // 替换为你在twelvedata平台申请的API密钥 const config = { apiKey: "你的twelvedata API Key" };
核心问题2:执行顺序不符合预期
JavaScript同步代码优先级高于异步回调,你把console.log('--- CRON FINISHED ---')放在同步执行栈中,会在Promise的then/catch回调之前执行,所以看不到异步逻辑的输出前就先打印了收尾日志。
如果要实现「初始化 -> 异步逻辑执行完成 -> 收尾」的顺序,推荐用async/await重写异步逻辑,代码可读性更高,顺序也完全可控。
优化点:移除冗余Promise包装
client.statistics本身已经返回Promise对象,你外层额外套的new Promise属于无用代码,没有实际作用还可能引入隐藏问题。
修复后完整代码
const cron = require('node-cron'); const twelvedata = require("twelvedata"); const config = { apiKey: "替换为你自己的twelvedata API Key" }; // 可选:添加运行锁,避免接口耗时超过5秒时出现任务并发 let isRunning = false; cron.schedule('*/5 * * * * *', async () => { if (isRunning) return; isRunning = true; try { // 初始化逻辑 const today = new Date(); const datetime = `${today.getFullYear()}-${today.getMonth() + 1}-${today.getDate()} ${today.getHours()}:${today.getMinutes()}:${today.getSeconds()}`; console.log('--- CRON START ---'); console.log('DATE-TIME', datetime); const params = { symbol: "5PAISA", exchange: "NSE", country: "India", }; // 等待异步接口执行完成 const client = twelvedata(config); const data = await client.statistics(params); console.log("All Worked", data); console.log(`The function received with value Resolved`); console.log('--- CRON END ---'); // 收尾逻辑 console.log('--- CRON FINISHED ---'); return datetime; } catch (error) { console.log('Error', error); console.log(`Handling error as we received Rejected`); console.log('ERROR'); console.log('--- CRON FINISHED ---'); return false; } finally { // 释放锁 isRunning = false; } });
内容的提问来源于stack exchange,提问作者Darshan Raval
相关产品推荐
相关产品推荐

