我有一個使用socket.io的Express.js網站。對于每個連接的用戶(套接字),呼叫一個可能需要很長時間才能解決的函式。
服務器.js
const app = express();
const server = http.createServer(app);
const io = new Server(server);
io.on('connection', async (socket) => {
console.log(`${socket.id}: socket connected`);
console.log(`${socket.id}: computation started`);
await longRunningTask();
console.log(`${socket.id}: computation completed`);
socket.on('disconnect', () => {
console.log(`${socket.id}: socket disconnected`);
// TODO: Check if `longRunningTask` has resolved. If it has not, cancel it
});
});
這是給定用戶在longRunningTask解決之前斷開連接的程式的當前流程:
用戶訪問網站(他們被分配了 socket.id tCzH)
tCzH: socket connected
tCzH: computation started
用戶斷開連接
tCzH: socket disconnected
一段時間過去了
tCzH: computation completed
longRunningTask我的目標是在套接字斷開連接的情況下立即終止。最好的方法是什么?
uj5u.com熱心網友回復:
不幸的是,不可能從 Javascript 的范圍之外終止函式的執行。即使您將您longRunningTask的 Promise 包裝在 Promise 中并手動拒絕該 Promise,它也不會阻止其堆疊的其余部分執行。
必須修改的實作,longRunningTask使其依賴于外部范圍內的全域變數,并且一旦該變數變為例如 false ,它應該從內部回傳或中斷自身。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/411565.html
標籤:
