在套接字断开连接的情况下终止承诺
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 或从在.
我有一个 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 或从在.