[英]Socket.io Multiple messages emitted from one event
我一直在寻找解决方案很长时间,但尚未找到任何东西。
每当服务器看到指定目录中的文件已更改时,我都试图从服务器发出消息。 但是,它不仅仅发出一条消息,而是坚持发出同一条消息3次。 我正在使用chokidar来查看目录,并且在'change'事件内部发出消息。
服务器端代码:
var express = require('express')
, app = express()
, http = require('http')
, server = http.Server(app)
, io =require('socket.io')(server)
, chokidar = require('chokidar');
server.listen(1234);
app.use('/public', express.static( __dirname + '/public'));
app.get('/', function(request, response){
var ipAddress = request.socket.remoteAddress;
console.log("New express connection from: " + ipAddress);
response.sendfile(__dirname + '/public/index.html'); //Server client
});
var watcher = chokidar.watch("temp", {ignored: /[\/\\]\./, persistent: true});
watcher.on('change', function(path){
console.log(path + " has changed.");
fs.readFile(path,'utf8', function(err, data){
if(err) {
return console.log(err);
}
else
{
var json = JSON.parse(data), recPsec, type;
recPsec = json.data[0].values[0];
type = json.data[0].values[16];
var compiled = {
"recPsec" : recPsec,
"type" : type
}
var jsonMessage = JSON.stringify(compiled)
io.sockets.emit('message', JSON.stringify(jsonMessage));
console.log("Sent message");
}
});
});
watcher.on('unlink', function(path){
console.log('File: ', path, ' has been removed');
});
watcher.on('add', function(path){
console.log("hi");
fs.readFile(path,'utf8', function(err, data){
if(err) {
return console.log(err);
}
else
{
var json = JSON.parse(data), recPsec, type;
recPsec = json.data[0].values[0];
type = json.data[0].values[16];
var compiled = {
"recPsec" : recPsec,
"type" : type
}
var jsonMessage = compiled;
io.sockets.emit('message', JSON.stringify(jsonMessage));
console.log("message sent");
}
//fs.unlinkSync(path);
});
});
客户端:
var socket = io.connect('http://localhost');
socket.on('message', function(data){
console.log(data);
var parsed = JSON.parse(data);
recPsecNew = parsed.recPsec;
typeNew = parsed.type;
analyze(recPsecNew, typeNew);
});
我将socket.io与express 4结合使用。可在此处找到Chokidar: https : //github.com/paulmillr/chokidar
如果我两次更改文件名,则从控制台记录的日志如下所示: http : //s000.tinyupload.com/?file_id=95726281991906625675
您是否尝试过lodash的功能?
可能可以使用lodash.debounce函数
根据其文档:
_.debounce(func, [wait=0], [options])
创建一个防反跳函数,该函数将调用func延迟到自上次调用防反跳函数以来经过的等待毫秒数之后。 去抖动功能带有取消方法,以取消延迟的调用。 提供一个选项对象,指示应该在等待超时的前沿和/或后沿调用func。 随后对反跳功能的调用将返回上一次func调用的结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.