Node.js开发倒计时出现count未定义及timer函数外未定义报错求解
问题原因
1. count is not defined报错
你将count作为命名函数表达式传入setInterval,这类函数的名称仅在函数自身内部作用域可访问,外层作用域无法直接调用count(),因此触发未定义报错。
2. 外部访问timer为undefined
setInterval是异步宏任务,注册后不会立刻执行回调函数,会优先执行后续的console.log(timer)、response.send逻辑,此时回调还未运行,timer没有被赋值,自然返回undefined。且即使后续回调执行更新了timer,接口响应已经提前返回,也无法把最新值传给前端。
另外你代码中countDown、distance、days等变量均未声明,会污染全局作用域,也存在隐式风险。
修复方案
如果你的需求是首次计算完所有订单倒计时后直接返回结果,可以参考以下修改后的代码:
const getOrder = async(request, response) => { const data = await knex("orderbook_table").select() const time_data = await knex("orderbook_table").select("timestamp") console.log(time_data) // 把count函数提到外层定义,支持全局调用 function count() { // 用数组存储所有订单的倒计时,避免只保留最后一个 const timerList = [] const second = 1000, minute = second * 60, hour = minute * 60, day = hour * 24; for (var i = 0; i < time_data.length; i++) { const entryDate = time_data[i].timestamp; const countDown = new Date(entryDate).getTime(); const now = new Date().getTime(); const distance = countDown - now; const days = Math.floor(distance / (day)); const hours = Math.floor((distance % (day)) / (hour)); const minutes = Math.floor((distance % (hour)) / (minute)); const seconds = Math.floor((distance % (minute)) / second); const timer = days + "d:" + hours + "h:" + minutes + "m:" + seconds + "s"; timerList.push(timer) } return timerList } // 同步调用count获取计算结果 const timerList = count(); console.log(timerList); // 把倒计时结果一起返回给前端 response.send({ orderStr: data, timerList }); // 如果需要后端定时更新倒计时,建议单独起定时任务,配合WebSocket推送给前端,不要写在接口逻辑里 // setInterval(count, 1000) }
如果需要实现前端实时刷新倒计时,更合理的方案是把时间戳返回给前端,由前端自己启动定时器计算更新,无需后端参与定时逻辑,减少服务端压力。
内容的提问来源于stack exchange,提问作者Calin89
相关产品推荐
相关产品推荐

