Node.js io.emit() Socketio.on тупит(не все передает)

174
20 марта 2019, 02:00

Есть код:

в server.js

const http = require('http').Server(express);
const io = require('socket.io')(http);
   function readSegmentFromFile(pos) {             // pos - позиция слайдера
    // ********** Чтение сегмента из двоичного файла *********
    segmentSize = segmentMap[pos];             // Размер сегмента, который считывается в данный момент
    var startPos = getStartPos();
    var SegmentBuf = Buffer.alloc(segmentSize);
    var data = null;
    fs.open(pathRead, 'r', function (error, fd) {
        if (error) {
            console.error('Error write: ' + error.message);
            return 0;
        }
        fs.read(fd, SegmentBuf, 0, segmentSize, startPos, function (err) {
            if (err) {
                console.error('Error write: ' + err.message);
            }
            setSliderPosition(sliderPos);
            var segmentHeader = new Parser()
                .doublebe('timestamp')
                .uint32('size')
                .uint8('type')
                .string('bytes', {
                    length: function () {
                        return this.size - 13;              // Вычисляем размер бинарной строки
                    }
                });
            //data = segmentHeader.parse( zlib.inflate(SegmentBuf));
            data = segmentHeader.parse(SegmentBuf);
            //sendDataFromSegmentToFile(zlib.inflate(JSON.parse(data.bytes)));
            sendDataFromSegmentToFile(JSON.parse(data.bytes));
            fs.close(fd, function (error) {
                if (error) {
                    console.error("Error: " + error.message);
                }
            });
        });
    });
}
function setPlayButton(param) {
    UIcommand.element = 'UIplay';
    UIcommand.action = param;
    console.log("стоп "+UIcommand.element+" "+UIcommand.action);
    io.emit('UI_stop', UIcommand);
}
function sendDataFromSegmentToFile(obj) {// вызывается из readSegmentFromFile
    if(VelocityProphet!=undefined){
        //console.log('VelocityProphet');
        io.emit('VelocityProphet', VelocityProphet);
    }
    if(smoothedProfile!=undefined){
        //console.log('smoothedProfile');
        io.emit('smoothedProfile', smoothedProfile);
    }
    //.....(if(...) еще десяток
}
setInterval(function () {
    if ((mode == 'file') && (replayState) && (segmentMapIsReady) && (!replayPause)) {
        readSegmentFromFile(sliderPos);     // функция readSegmentFromFile() вернет время записи сегмента
        setSliderPosition(sliderPos);
        console.log(sliderPos);
        sliderPos++;
        if (sliderPos == numberOfSegments) {
            sliderPos = 0;
            setPlayButton('stop');
        }
    }
}, 10);//1000

в browser.js

function InitSocketIO(){
socketio = io.connect('http://localhost:3000', {reconnect: true}); // Создаем соединение с сервером http://localhost:3000
socketio.on('UI_stop', function (msg) {
    console.log("UI: "+msg.element);
    switch (msg.element) {
        case 'UIplay':
            var $playbutton = $('#playbutton');
            console.log("UIplay playbutton");
            if (msg.action == 'stop') {
                console.log("UIplay Остановка чтения");
                $playbutton.click();
            }
            break;
  //...                    
        default:
            break;
    }
});
socketio.on('VelocityProphet', function (msg) {        
    //Код
});
socketio.on('smoothedProfile', function (msg) {
// Код
});

программа считывает данные из файла по сегментам. функция sendDataFromSegmentToFile вызывается больше 2000 раз, и socketio.on('VelocityProphet'..., socketio.on('smoothedProfile'... и т. п. отрабатывают штатно.

функция setPlayButton должна вызываеться один раз когда все сегменты считались. и остановить считывание. Но io.emit('UI_stop', UIcommand); и socketio.on('UI_stop', function (msg) не срабатывают соответственно считывание начинается с начала.

при этом если проследить очередность вызова всех io.emit то на последнем шаге io.emit('UI_stop' вызывается раньше чем io.emit('VelocityProphet' и им подобные, хотя по коду должно быть наоборот.

READ ALSO
Как вызвать мутацию из экшена

Как вызвать мутацию из экшена

Использую Vuejs, имеется вот такой actions:

163
Должен ли я минифицировать мой css и javascript код в Laravel?

Должен ли я минифицировать мой css и javascript код в Laravel?

Javascript код веб сайта находятся в директории pulbic, должен ли я минифицировать свой код для готовой версии сайта ?

154
Замылить фоновую картинку средствами CSS

Замылить фоновую картинку средствами CSS

На Behance нашел интересный эффект

142
Вёрстка 14 колонок в макете разрешение 1360px

Вёрстка 14 колонок в макете разрешение 1360px

Есть макет размер контента 1360pxИ 14 колонок

166