在 Node.js 中获取计时器 ID
Get Timer ID in Node.js
我在 NodeJS 应用程序中有一个简单的服务器端计时器,用于通过套接字向客户端发送一些数据。我如何设法将计时器 ID 发送到客户端,以便它可以从客户端停止?
我试图在套接字有效负载中传递返回的 class,但出现错误“超出最大调用堆栈大小。
socket.on('start', () => {
const timerID = setInterval(()=>{
socket.emit('data',someData)
},3000)
socket.emit('ID',timerId)
}
也尝试映射 class 个符号,但没有任何效果。
const array = Object.getOwnPropertySymbols(timerID);
array.map((symbol) => {
clearInterval(timerID[symbol]);
});
在 NodeJS 文档中找到:
timeout[Symbol.toPrimitive]"()
Returns: number that can be used to reference this timeout
但是也没用。
客户端无法停止您的 timerID
,并且在 nodejs 中,timerID 不是简单的整数,也不是可以字符串化的东西,因此无法有效地发送给客户端。
您可以创建自己的映射到实际 timerID 的整数标识符,将其发送给客户端,然后客户端可以向服务器发回一条消息,表明它希望取消计时器 X。您可以在中查找 timerX您的地图,找到真正的 timerID 并停止计时器。
const timerMap = new Map();
const timerCntr = 0;
socket.on('start', () => {
const timerID = setInterval(()=>{
socket.emit('data', someData)
}, 3000);
// create an integer reference for the timer
// save a mapping between the integer reference and the actual timerID
// in a server-side Map object
const externalTimerID = timerCntr++;
timerMap.set(externalTimerID, timerID);
socket.emit('ID', externalTimerID);
}
// when client wants to stop the timer
socket.on('stop', externalTimerID => {
let timerID = timerMap.get(externalTimerID);
clearInterval(timerID);
// remove externalTimerID from the Map so we don't leak memory
timerMap.delete(externalTimerID);
});
从节点 v14.9.0 开始,您可以获得 timerID 的整数版本,它将替代实际的 timerID 对象。
socket.on('start', () => {
const timerID = setInterval(()=>{
socket.emit('data', someData)
}, 3000);
socket.emit('ID', timerID[Symbol.toPrimitive]());
}
// when client wants to stop the timer
socket.on('stop', externalTimerID => {
clearInterval(externalTimerID );
});
这是一个示例 nodejs 应用程序,我在其中验证了 timerID[Symbol.toPrimitive]()
是一个数字并且可以替代 timerID 对象。
const timerID = setInterval(() => {
console.log(`hi`);
}, 500);
const integerID = timerID[Symbol.toPrimitive]();
console.log(typeof integerID, integerID); // shows it is an integer
setTimeout(() => {
console.log("clearing Interval with integerID");
clearInterval(integerID);
}, 2000);
我在 NodeJS 应用程序中有一个简单的服务器端计时器,用于通过套接字向客户端发送一些数据。我如何设法将计时器 ID 发送到客户端,以便它可以从客户端停止?
我试图在套接字有效负载中传递返回的 class,但出现错误“超出最大调用堆栈大小。
socket.on('start', () => {
const timerID = setInterval(()=>{
socket.emit('data',someData)
},3000)
socket.emit('ID',timerId)
}
也尝试映射 class 个符号,但没有任何效果。
const array = Object.getOwnPropertySymbols(timerID);
array.map((symbol) => {
clearInterval(timerID[symbol]);
});
在 NodeJS 文档中找到:
timeout[Symbol.toPrimitive]"()
Returns: number that can be used to reference this timeout
但是也没用。
客户端无法停止您的 timerID
,并且在 nodejs 中,timerID 不是简单的整数,也不是可以字符串化的东西,因此无法有效地发送给客户端。
您可以创建自己的映射到实际 timerID 的整数标识符,将其发送给客户端,然后客户端可以向服务器发回一条消息,表明它希望取消计时器 X。您可以在中查找 timerX您的地图,找到真正的 timerID 并停止计时器。
const timerMap = new Map();
const timerCntr = 0;
socket.on('start', () => {
const timerID = setInterval(()=>{
socket.emit('data', someData)
}, 3000);
// create an integer reference for the timer
// save a mapping between the integer reference and the actual timerID
// in a server-side Map object
const externalTimerID = timerCntr++;
timerMap.set(externalTimerID, timerID);
socket.emit('ID', externalTimerID);
}
// when client wants to stop the timer
socket.on('stop', externalTimerID => {
let timerID = timerMap.get(externalTimerID);
clearInterval(timerID);
// remove externalTimerID from the Map so we don't leak memory
timerMap.delete(externalTimerID);
});
从节点 v14.9.0 开始,您可以获得 timerID 的整数版本,它将替代实际的 timerID 对象。
socket.on('start', () => {
const timerID = setInterval(()=>{
socket.emit('data', someData)
}, 3000);
socket.emit('ID', timerID[Symbol.toPrimitive]());
}
// when client wants to stop the timer
socket.on('stop', externalTimerID => {
clearInterval(externalTimerID );
});
这是一个示例 nodejs 应用程序,我在其中验证了 timerID[Symbol.toPrimitive]()
是一个数字并且可以替代 timerID 对象。
const timerID = setInterval(() => {
console.log(`hi`);
}, 500);
const integerID = timerID[Symbol.toPrimitive]();
console.log(typeof integerID, integerID); // shows it is an integer
setTimeout(() => {
console.log("clearing Interval with integerID");
clearInterval(integerID);
}, 2000);