Node.js如何实现for循环按时间间隔迭代完成订单自动派单需求
Node.js 订单定时推送司机实现方案
完全可以实现你需要的逻辑,普通同步for循环不支持等待间隔,你可以结合async/await+Promise延时的方案实现,具体逻辑如下:
核心实现思路
- 封装通用延时工具函数
sleep,用于实现拒单后的等待逻辑 - 单个订单的司机推送流程串行执行:推送给当前司机→等待司机反馈→拒单则等待30秒→推送给下一位司机,接单则直接终止当前订单的匹配流程
- 多个订单之间默认并行处理,避免所有订单排队等待导致的匹配超时,也可根据业务需求调整为串行执行
完整代码示例
// 1. 封装延时工具函数,参数单位为毫秒 const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms)); // 2. 单个订单的司机匹配逻辑 async function matchOrderDrivers(order, drivers, retryDelay = 30 * 1000) { for (const driver of drivers) { console.log(`给订单${order}推送司机${driver}`); // 调用实际的司机接单判断逻辑,等待司机反馈 const isAccept = await checkDriverAccept(order, driver); if (isAccept) { console.log(`司机${driver}接了订单${order},匹配完成`); return { order, driver, status: 'success' }; } console.log(`司机${driver}拒单,等待${retryDelay/1000}秒后推送下一位司机`); // 拒单后等待指定时间再进入下一轮循环 await sleep(retryDelay); } // 所有司机都拒单的兜底逻辑 console.log(`订单${order}所有司机均拒单,匹配失败`); return { order, status: 'failed' }; } // 模拟司机接单判断的接口,可替换为实际业务逻辑 async function checkDriverAccept(order, driver) { // 此处可替换为推送司机通知、等待司机端返回等实际业务逻辑 return Math.random() > 0.8; // 模拟20%的接单概率 } // 3. 批量处理所有订单(并行版本) async function batchMatchOrders(orders, drivers) { // 所有订单并行发起匹配,互不阻塞 const matchPromises = orders.map(order => matchOrderDrivers(order, drivers)); const results = await Promise.allSettled(matchPromises); console.log('所有订单匹配完成,结果:', results); } // 测试调用 const orders = Array.from({length: 100}, (_, i) => i + 1); const drivers = Array.from({length: 50}, (_, i) => i + 1); batchMatchOrders(orders, drivers);
可选调整说明
- 如果业务要求订单必须按顺序匹配,不能并行,可以把
batchMatchOrders里的map+Promise.allSettled替换为普通for循环+await,逐个处理订单即可 - 延时时间可根据业务场景动态调整,比如高峰时段缩短推送间隔,低峰时段拉长间隔
- 建议添加单个订单匹配超时兜底逻辑,避免无限等待消耗资源
内容的提问来源于stack exchange,提问作者ADEEL FAROOQ
相关产品推荐
相关产品推荐

