React视图未成功收听商店

时间:2015-07-12 11:51:52

标签: javascript reactjs reactjs-flux

我有a React controller-view订阅两个不同的商店,并启动会导致每个商店发出的调用:

componentWillMount() {
  UserStore.addChangeListener(this._onChange);
  EventStore.addChangeListener(this._onChange);
}

componentDidMount() {
  UserService.getUser(this.props.params.slug)
  EventService.fetchEventsForUser(this.props.params.slug);
}

对于UserStore监听器,这很好用。用户从API中获取,返回the UserStore,发出更改。如果我将console.log语句放入其中,我可以完全按照我期望的方式看到所有这些流程,以我的控制器视图的_onChange函数结束。

但是。由于某些莫名其妙的原因,添加到the EventStore的更改侦听器并未触发。这些事件是从API中正确获取的,并返回到我期望的EventStore方法,该方法正确更新EventStore的内部状态,甚至会触发emitChange()很好(我已经通过大量的console.log声明进行了验证)。但是从不调用控制器视图中的_onChange

我一直在努力解决这个问题,接近两位数小时。与开始时相比,我感觉不到任何答案。我甚至不知道在哪里看。

其他说明

  • 我尝试从控制器视图中删除UserStore侦听器,只在UserStore中设置静态内容。我想也许两次更新之间可能存在竞争条件。什么都没有改变。
  • 我尝试将我的控制器视图_onChange分成两个独立的功能,再次怀疑他们并没有很好地一起玩。但console.log显示_onUserChange按预期调用,但_onEventChange从未被调用过。
  • 这曾经工作过!在主分支中,拉动请求我已经链接到分支,它可以工作!所有内容的结构都有所不同,其中 - 控制器视图我一直在链接只监听UserStore中的更改,而其子组件则监听EventStore中的更改。但是,如果我复制这个结构,它仍然无法工作。在我的新分支中,EventStore中任何正在听取变化的组件似乎都对这些变化完全置若罔闻。
  • 同样在master上,EventStore比现在做了更多的计算。我非常怀疑它的缓慢会使听众更有可能听到它。 UserStore等同于简单,听众听到它没有问题。
  • 有时它 工作。大约1页加载100,它可以工作。组件更新其状态,实际显示加载服务器的内容。我还没有能够重现这一点或确定是什么导致它。
  • Another component in this app也会听取EventStore更改,也很少听到它们。
  • 您可以看到它无法在http://life.chadoh.com/#/chadoh工作。如果您随后访问http://life.chadoh.com/#/chadoh/week/0,则会看到已从服务器正确加载了某个事件。但出于某种原因,听众没有得到警报。如果您在http://life.chadoh.com/#/chadoh/week/0上刷新页面,则边栏将永远不会使用事件进行更新(不同之处在于它是否在EventStore之前或之后最初呈现了数据)。
  • get events()中的EventStore方法更改为常规events()无效。
  • EventService.fetchEvents来电置于setTimeout内并不会产生更好的结果。
  • listen调用放在构造函数中不会产生更好的结果。

1 个答案:

答案 0 :(得分:4)

我看到EventsStore扩展BaseStore扩展events.EventEmitter。那是node.js标准库事件发射器吗?

如果是这样,您_events可能会出现命名冲突。

您的商店使用_events来保存数据:https://github.com/chadoh/life/blob/no-dates/src/stores/EventStore.js#L10

EventEmitter也使用_events来存储事件处理程序:https://github.com/joyent/node/blob/d13d7f74d794340ac5e126cfb4ce507fe0f803d5/lib/events.js#L140-L186

因此,事件数据可能会覆盖事件处理程序的集合,导致处理程序永远不会触发(因为它们不存在!)。

您可以尝试使用其他键来保存数据(例如_eventData)并查看是否能解决您的问题!