【问题标题】:Terminate promise given a socket disconnects给定套接字断开连接终止承诺
【发布时间】:2022-01-15 18:40:37
【问题描述】:

我有一个使用socket.ioExpress.js 网站。对于每个连接的用户(套接字),都会调用一个可能需要很长时间才能解析的函数。

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.id tCzH

tCzH: socket connected
tCzH: computation started

用户断开连接

tCzH: socket disconnected

一段时间过去了

tCzH: computation completed

我的目标是在套接字断开的情况下立即终止longRunningTask。最好的方法是什么?

【问题讨论】:

  • 你应该先监听disconnect事件之前等待longRunningTask完成:-)

标签: javascript node.js async-await promise cancellation


【解决方案1】:

不幸的是,在 Javascript 中无法从其范围之外终止函数的执行。即使您将 longRunningTask 包装在 Promise 中并手动拒绝该 Promise,它也不会阻止其堆栈的其余部分执行。

longRunningTask 的实现必须进行修改,使其依赖于外部范围内的全局变量,并且一旦该变量变为例如 false,它应该从内部返回或中断自身。

【讨论】:

    猜你喜欢
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    相关资源
    最近更新 更多