如何用async/await实现每隔4秒调用异步函数(含Timeout)
正确结合async/await与Timeout实现定时调用异步函数
一、修正原异步函数sendWhatsappMessage
先优化原函数的写法,去掉冗余的.then()(await已能等待Promise完成,无需额外链式调用):
exports.sendWhatsappMessage = async (data) => { // 获取WhatsApp客户端实例 let client = wwjsInstances.getInstance(data.client_id); // 发送消息:用await替代then,逻辑更清晰 await client.sendMessage(`${data.recipient}@c.us`, data.message); console.log('DONE'); // 返回结果对象 return { ok: true, params: data, message: `[WhatsApp] : Task ${data.client_id}: Succeeded` }; };
二、实现可靠的定时调用逻辑
直接用setInterval套异步函数容易出现任务堆积(如果异步函数执行时间超过间隔),推荐用async/await + 循环 + 延迟函数的组合,逻辑更可控:
1. 封装通用延迟函数
把setTimeout包装成Promise,方便配合await实现暂停:
// 延迟函数:等待指定毫秒数后完成 function delay(ms) { return new Promise(resolve => setTimeout(resolve, ms)); }
2. 定时循环调用的核心函数
// 定时任务的开关,用于控制启动/停止 let isTaskRunning = true; /** * 定时循环发送WhatsApp消息 * @param {Object} data - 发送消息的参数(与sendWhatsappMessage一致) * @param {number} interval - 调用间隔,默认4000毫秒(4秒) */ async function sendPeriodically(data, interval = 4000) { while (isTaskRunning) { try { // 调用异步发送函数并等待完成 const result = await exports.sendWhatsappMessage(data); console.log(result.message); } catch (err) { // 捕获错误,避免循环因单次发送失败中断 console.error('[WhatsApp] 消息发送失败:', err); } // 等待指定间隔后,执行下一次调用 await delay(interval); } }
3. 启动与停止定时任务
// 启动定时任务:传入你的业务参数 sendPeriodically({ client_id: 'your-client-id', recipient: '123456789', message: '定时发送的消息内容' }); // 如需停止任务,只需切换开关状态 // isTaskRunning = false;
三、你之前的错误原因分析
你之前的代码出现TypeError: resolve is not a function及逻辑混乱,核心问题是:
- 在**非async函数
timeout**中使用await,属于语法错误; - 强行将消息发送逻辑与延迟逻辑耦合,导致Promise的使用完全混乱;
- 错误地提前resolve Promise,完全没起到延迟调用的作用。
内容的提问来源于stack exchange,提问作者yeln
相关产品推荐
相关产品推荐

