Расширенные функции эмиттера событий в магазинах конфликтуют во Flux

У меня несколько магазинов Flux. Теперь ясно, что все они расширяют один и тот же синглтон эмиттера событий. Это привело к тому, что события в магазинах конфликтовали друг с другом (даже самые распространенные, emitChange). Кажется, что нет никакой разницы между выполнением Store1.getID() и Store2.getID(), потому что магазины кажутся одним большим объектом, вытянувшимся из любого другого магазина. Что я делаю не так?

У меня уже давно есть эта проблема, и она сводит меня с ума. Я уверен, что у этого есть простой ответ, который мне не хватает. Это одна из причин, по которой я жду реле и GraphQL.

EDIT: как все мои магазины выглядят в коде.

var Events = require('events'), extend = require('deep_extend'),
    EventEmitter = Events.EventEmitter,
    CHANGE_EVENT = 'change';

var SomeStore = extend(EventEmitter.prototype, {
    someGetter: function(){
        return _someVar;
    },
    dispatchToken: AppDispatcher.register(function(action) {
        switch(action.type) {
            case 'SOME_ACTION':
                _someVar = 'someValue'
                break;

            default:
                return true;
        }

        SomeStore.emitChange();
        return true;
    })
});

return SomeStore;

person Varun Arora    schedule 04.02.2015    source источник
comment
Как вы создаете свои магазины? Можете ли вы поделиться своим кодом?   -  person nilgun    schedule 05.02.2015


Ответы (1)


магазины кажутся одним большим объектом, вытянувшимся из любого другого магазина.

Должна быть какая-то проблема с тем, как вы расширяетесь от EventEmitter, иначе ваш код должен работать нормально.

Теперь, когда есть несколько способов сделать то же самое, вот как facebook реализовал это в своем официальные примеры:

var assign = require('object-assign');
var EventEmitter = require('events').EventEmitter;
var TodoStore = assign({}, EventEmitter.prototype, {
    ...

ОБНОВЛЕНИЕ

Теперь глядя на ваш код

extend(EventEmitter.prototype, {

на самом деле пишет на самом прототипе, отсюда и ошибки, которые вы получили. Вместо этого вы должны расширять пустой объект:

extend({}, EventEmitter.prototype, {
person nilgun    schedule 04.02.2015
comment
ОЙ! Так что я думаю, что сильно запутался в том, что делает assign. Так ли это здесь? (размещенный магазин для вас) - person Varun Arora; 05.02.2015
comment
Вероятно, вы пишете на прототипе EventEmitter. Можешь попробовать extend({},EventEmitter.prototype, { .. - person nilgun; 05.02.2015
comment
deep_extend не принимает более двух объектов. Думаю, я просто воспользуюсь assign. спасибо! Вы правы - я пишу о прототипе EE, что является плохой идеей. - person Varun Arora; 05.02.2015
comment
Если я смотрю на правильный код, deep_extend может принимать более 2 аргументов: github.com/unclechu/node-deep-extend/blob/master/index.js - person nilgun; 05.02.2015
comment
Вы снова правы, сэр @nilgun. Если вы сомневаетесь, следует выйти за рамки документов. Работает! - person Varun Arora; 05.02.2015