我有一个Express.js网站,它使用socket.io。对于每个连接的用户(套接字(,都会调用一个可能需要很长时间才能解决的函数。
server.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.idtCzH
(
tCzH: socket connected
tCzH: computation started
用户断开连接
tCzH: socket disconnected
一段时间过去了
tCzH: computation completed
我的目标是在插座断开的情况下立即终止longRunningTask
。什么是最好的方法?
不幸的是,在Javascript中,不可能从函数的作用域之外终止函数的执行。即使您将longRunningTask
封装在Promise中并手动拒绝该Promise,它也不会阻止其堆栈的其余部分执行。
必须修改longRunningTask
的实现,使其依赖于外部范围中的全局变量,一旦该变量变为false,它就应该从内部返回或中断。