Skip to content

Не работает emit событий отправленных друг за другом #14

@NeXTs

Description

@NeXTs

Привет

На днях заметил что не работает .emit событий отправленных друг за другом.

Пример

channel.emit('demo_trigger', 'ya1', duel.getWindowID())
channel.emit('demo_trigger', 'ya2', duel.getWindowID())
channel.emit('demo_trigger', 'ya3', duel.getWindowID())

Чтоб воспроизвести, вставь содержимое этого в свой public/index.html. Открой две вкладки и нажми кнопку эмита. Во второй вкладке в консоли вместо трех разных сообщений будет два "ya3". Остальные теряются.

Перебором определил что более-менее без потерь (и то не в 100% случаях) сообщения начинают доставляться только с 750мс задержкой между вызовами.

channel.emit('demo_trigger', 'ya1', duel.getWindowID())
setTimeout(function() {
    channel.emit('demo_trigger', 'ya2', duel.getWindowID())
    setTimeout(function() {
        channel.emit('demo_trigger', 'ya3', duel.getWindowID())
    }, 750)
}, 750)

У себя в проекте я использую dueljs для синхронизации redux стора между табами передавая экшны с мастера слейвам. Из-за этих потерь начались проблемы )
В качестве костыля создал буффер и _.throttle на 750мс, стало чуть лучше, но все равно бывают потери. Хотелось бы решения на уровне библиотеки :)

import throttle from 'lodash/throttle'
import each from 'lodash/each'
import duel from 'dueljs'

let syncStore = duel.channel('syncStoreChannel')

const syncState = (store) => {
    syncStore.on('sync', function(actions) {
        each(actions, store.dispatch)
    })
}

let actionsBuffer = []
const flushActionsBuffer = throttle(() => {
    syncStore.emit('sync', actionsBuffer)
    actionsBuffer.length = 0
}, 750)

export const createSyncMiddleware = store => next => action => {
    if(window.isMaster()) {
        actionsBuffer.push(action)
        flushActionsBuffer()
    }
    next(action)
}

export default syncState

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions