[英]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.