NodeJSアプリケーションに、ソケット付きのデータをクライアントに送信するための単純なサーバー側タイマーがあります。クライアント側からタイマーIDを停止できるように、タイマー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をキャンセルしたいというメッセージをサーバーに送り返すことができます。マップで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 );
});
これtimerID[Symbol.toPrimitive]()
は、それが数値であり、timerIDオブジェクトの代わりとして機能することを確認したサンプルnodejsアプリです。
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);
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加