【问题标题】:breake timer on socket event在套接字事件上中断计时器
【发布时间】:2018-02-28 16:56:48
【问题描述】:

我需要在套接字事件上中断计时器,我的 Nodejs Express Socket.io 应用程序如下所示:

app.js

const express = require('express') ;
const app = express();
const server = require('http').Server(app);
const io = require('socket.io')(server);
const api = require('./routes/api');

const users = io.of('/users') ;

const usersNamespace= (socket) => {
   socket.on('disconnect',()=>{
   });
}

users.on('connection',usersNamespace) ;

app.use('/api', api);
// make socket.io accessible in the express router
app.use((req,res,next)=>{
   req.io = io;
   req.users = users;
   next();
});
server.listen('8000');

我的./routes/api.js 文件看起来像:

var express = require('express');
var router = express.Router();

router.post('/test',req,res) {
    // broadcast body of request to users namespace
    req.users.emit('restreq',req.body) ;

    var timer = setInterval(()=>{
       console.log('hello');
    }, 5000);

    res.status(200).json('received') ;
}

module.exports = router;

问题是我如何做clearInterval 并在接收套接字事件时停止计时器?

【问题讨论】:

    标签: node.js express socket.io


    【解决方案1】:

    您可以像使用users 一样传递一个函数或对象来处理间隔:

    app.js

    const express = require('express') ;
    const app = express();
    const server = require('http').Server(app);
    const io = require('socket.io')(server);
    const api = require('./routes/api');
    
    const users = io.of('/drivers') ;
    
    const timer = {
        hInterval: null,
        register: hInterval => {
            timer.hInterval = hInterval
        },
        disable: () => {
            clearInterval(timer.hInterval)
            timer.hInterval = null
        }
    }
    
    const usersNamespace = socket => {
       socket.on('disconnect', () => {
           timer.disable()
       });
    }
    
    users.on('connection', usersNamespace) ;
    
    app.use('/api', api);
    // make socket.io accessible in the express router
    app.use((req, res, next)=>{
       req.io = io;
       req.users = users;
       req.timer = timer;
       next();
    });
    server.listen('8000');
    

    api.js:

    var express = require('express');
    var router = express.Router();
    
    router.post('/test', req,res) {
        // broadcast body of request to users namespace
        req.users.emit('restreq',req.body) ;
        req.timer.register(setInterval(() => {
           console.log('hello');
        }, 5000));
    
        res.status(200).json('received') ;
    }
    
    module.exports = router;
    

    【讨论】:

    • 计时器不会在套接字事件上的req.timer.disable()timer.disable() 上停止。为什么?
    • 我的错,有一个错字,对不起。请使用更新的代码重试。
    • 我也纠正了错字,但根据this,重点是我应该保存计时器ID并在上面做clearInterval
    • 这已经完成了。为了以防万一,我已经更改了一个冲突的变量名,请您再测试一下代码吗?
    • 我确实测试过了。重点是setIntervalsetTimeout 将返回一个循环对象,其中包含每个计时器实例的标识和详细信息。当我们需要在套接字事件上中断特定计时器时,我们需要处理正确的实例。所以我像这样使用setIntervalglobal.timers[index] = setInterval(function(),1000) 然后将索引保存为redis 键,然后我可以结合使用redis和定时器数组来访问特定的定时器。感谢您的关注。
    猜你喜欢
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 2014-08-28
    • 1970-01-01
    • 2016-10-05
    • 2017-04-28
    相关资源
    最近更新 更多