setInterval() inside express router.use() 不正确
setInterval() inside express router.use() not correct
我在 router.use()
的 node.js 快速路线中使用 setInterval()
,但不久之后,间隔开始跳跃。看起来它在一段时间后被触发了不止一次。有什么问题吗?
const router = express.Router();
router.use( (req, res, next) => {
// Wrong logging, starts to jump after some time
setInterval(update, 5000, "Updating inside router.use()...");
next();
});
function update(message) {
console.log(message, new Date())
}
// Correct logging (every 5 seconds)
setInterval(update, 5000, "Updating...");
这是输出:
Updating... 2022-02-24T21:50:41.545Z
Updating inside router.use()... 2022-02-24T21:50:46.025Z
Updating... 2022-02-24T21:50:46.545Z
Updating inside router.use()... 2022-02-24T21:50:51.026Z
Updating... 2022-02-24T21:50:51.546Z
Updating inside router.use()... 2022-02-24T21:50:56.027Z
Updating... 2022-02-24T21:50:56.547Z
Updating inside router.use()... 2022-02-24T21:50:58.155Z
Updating inside router.use()... 2022-02-24T21:51:01.028Z
Updating... 2022-02-24T21:51:01.548Z
Updating inside router.use()... 2022-02-24T21:51:03.156Z
Updating inside router.use()... 2022-02-24T21:51:06.028Z
Updating... 2022-02-24T21:51:06.549Z
Updating inside router.use()... 2022-02-24T21:51:08.156Z
Updating inside router.use()... 2022-02-24T21:51:10.339Z
Updating inside router.use()... 2022-02-24T21:51:11.030Z
我在这里简化了我的 router.use() 示例,但我需要 setInterval() 在其中工作。
将 setInterval()
放入 router.use()
将为到达此路由器的每个传入请求启动一个新的单独间隔计时器。两次请求后,您将拥有两个独立的间隔计时器。三个请求后,您将拥有三个独立的间隔计时器,它们将永远继续堆积 - 同时 运行ning。所以,间隔没有跳跃,你只是让多个间隔计时器重叠,你看到多个计时器的组合结果 运行ning 一次,每个计时器在不同时间开始。
这不是正确的设计。
请记住,这些计时器 运行 代表整个服务器,而不仅仅是一个用户或一个请求。一旦你启动了一个间隔计时器,它就会一直持续下去,直到你对其调用 clearInterval(timerId)
。
你没有在这里描述实际的设计问题(你试图用计时器解决什么问题)所以我们无法提供建议的设计。最有可能的是,您永远只想要一个计时器。理想情况下,您不会对任何内容进行投票,而是会找到更多 event-driven 设计。
我在 router.use()
的 node.js 快速路线中使用 setInterval()
,但不久之后,间隔开始跳跃。看起来它在一段时间后被触发了不止一次。有什么问题吗?
const router = express.Router();
router.use( (req, res, next) => {
// Wrong logging, starts to jump after some time
setInterval(update, 5000, "Updating inside router.use()...");
next();
});
function update(message) {
console.log(message, new Date())
}
// Correct logging (every 5 seconds)
setInterval(update, 5000, "Updating...");
这是输出:
Updating... 2022-02-24T21:50:41.545Z
Updating inside router.use()... 2022-02-24T21:50:46.025Z
Updating... 2022-02-24T21:50:46.545Z
Updating inside router.use()... 2022-02-24T21:50:51.026Z
Updating... 2022-02-24T21:50:51.546Z
Updating inside router.use()... 2022-02-24T21:50:56.027Z
Updating... 2022-02-24T21:50:56.547Z
Updating inside router.use()... 2022-02-24T21:50:58.155Z
Updating inside router.use()... 2022-02-24T21:51:01.028Z
Updating... 2022-02-24T21:51:01.548Z
Updating inside router.use()... 2022-02-24T21:51:03.156Z
Updating inside router.use()... 2022-02-24T21:51:06.028Z
Updating... 2022-02-24T21:51:06.549Z
Updating inside router.use()... 2022-02-24T21:51:08.156Z
Updating inside router.use()... 2022-02-24T21:51:10.339Z
Updating inside router.use()... 2022-02-24T21:51:11.030Z
我在这里简化了我的 router.use() 示例,但我需要 setInterval() 在其中工作。
将 setInterval()
放入 router.use()
将为到达此路由器的每个传入请求启动一个新的单独间隔计时器。两次请求后,您将拥有两个独立的间隔计时器。三个请求后,您将拥有三个独立的间隔计时器,它们将永远继续堆积 - 同时 运行ning。所以,间隔没有跳跃,你只是让多个间隔计时器重叠,你看到多个计时器的组合结果 运行ning 一次,每个计时器在不同时间开始。
这不是正确的设计。
请记住,这些计时器 运行 代表整个服务器,而不仅仅是一个用户或一个请求。一旦你启动了一个间隔计时器,它就会一直持续下去,直到你对其调用 clearInterval(timerId)
。
你没有在这里描述实际的设计问题(你试图用计时器解决什么问题)所以我们无法提供建议的设计。最有可能的是,您永远只想要一个计时器。理想情况下,您不会对任何内容进行投票,而是会找到更多 event-driven 设计。