跨商店的扩展事件发射器功能在 Flux 中发生冲突

Posted

技术标签:

【中文标题】跨商店的扩展事件发射器功能在 Flux 中发生冲突【英文标题】:Extended event emitter functions across stores are ***ing in Flux 【发布时间】:2015-04-04 14:42:16 【问题描述】:

我有多个 Flux 商店。现在很明显,它们都在扩展同一个事件发射器单例。这导致商店之间的事件相互冲突(即使是最常见的,emitChange)。做Store1.getID()Store2.getID() 似乎没有区别,因为商店似乎是从其他商店扩展而来的一个大对象。我做错了什么?

这个问题我已经有一段时间了,这让我发疯了。我相信这有一个我想念的简单答案。这是我等待中继和 GraphQL 的原因之一。

编辑:我所有的商店在代码中的样子。

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;

【问题讨论】:

您如何创建自己的商店?你能分享你的代码吗? 【参考方案1】:

商店似乎是从其他商店延伸出来的一个大对象。

您从EventEmitter 扩展的方式一定有问题,否则您的代码应该可以正常工作。

既然有几种方法可以做同样的事情,下面是 facebook 在他们的official examples 中实现它的方式:

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

更新

现在查看您的代码

extend(EventEmitter.prototype, 

实际上是在原型本身上书写,因此会出现错误。相反,您应该扩展一个空对象:

extend(, EventEmitter.prototype, 

【讨论】:

哦!所以我想我主要对assign 的作用感到困惑。这里是这样吗? (为您发布商店) 您可能正在编写 EventEmitter 原型。你可以试试extend(,EventEmitter.prototype, .. deep_extend 不接受两个以上的对象。我猜我只会使用assign。非常感谢!你是对的 - 我正在写 EE 的原型,这是一个坏主意 如果我正在查看正确的代码,deep_extend 可以接受超过 2 个参数:github.com/unclechu/node-deep-extend/blob/master/index.js 你又是对的,先生@nilgun。如有疑问,应该超越文档。有效!

以上是关于跨商店的扩展事件发射器功能在 Flux 中发生冲突的主要内容,如果未能解决你的问题,请参考以下文章

Flux - 如何处理多个商店更新相同的视图?

React Flux 实现调度链

视图应该直接打电话给商店吗?

Reactor响应式编程(FluxMono)基本用法

如何等待从另一家商店在一家商店发生的调度

Flux Utils 存储和异步定时器