繁体   English   中英

在 Node.js 中获取计时器 ID

[英]Get Timer ID in Node.js

我在 NodeJS 应用程序中有一个简单的服务器端计时器,可以通过套接字向客户端发送一些数据。 我如何设法将计时器 ID 发送到客户端,以便它可以从客户端停止?

我试图在套接字负载中传递返回的类,但收到错误“超出最大调用堆栈大小。

socket.on('start', () => {
const timerID = setInterval(()=>{
   socket.emit('data',someData)
   },3000)
socket.emit('ID',timerId)
}

还尝试映射类符号,但没有任何效果。

const array = Object.getOwnPropertySymbols(timerID);

array.map((symbol) => {
clearInterval(timerID[symbol]);
 });

在 NodeJS 文档中找到:

timeout[Symbol.toPrimitive]"()

返回:可用于引用此超时的数字

但它也没有奏效。

客户端无法停止您的timerID并且在 nodejs 中, timerID 也不是简单的整数,也不是可以字符串化的东西,因此无法有效地将其发送到客户端。

您可以创建映射到实际 timerID 的自己的整数标识符,将其发送给客户端,然后客户端可以向服务器发送一条消息,希望取消计时器 X。您可以在 Map 中查找 timerX,找到real 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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM