如果套接字断开连接,则终止承诺



我有一个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,它就应该从内部返回或中断。

最新更新