在套接字断开连接的情况下终止承诺

Terminate promise given a socket disconnects

我有一个 Express.js website that utilizes 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,它应该 return 或从在.