我有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获取用户,该API返回the UserStore
,并发出更改。如果放入console.log
语句,则可以按照我期望的方式完全看到所有这些流,并以我的控制器视图的_onChange
函数结束。但。由于某些无法解释的原因,添加到the
EventStore
的更改侦听器无法启动。这些事件是从API正确提取的,并返回到我期望的EventStore
方法,该方法可以正确更新EventStore
的内部状态,甚至可以触发emitChange()
正常(我已通过大量验证console.log
语句)。但是从不调用controller-view中的_onChange
!我一直在尝试解决这个问题,时间将近两位数。我没有比开始时更接近答案的感觉。我什至不知道在哪里看。
其他注意事项
我尝试从控制器视图中删除
UserStore
侦听器,只是在UserStore
中设置静态内容。我认为两次更新之间可能存在竞争状况。没有改变。我试图将控制器视图的
_onChange
拆分为两个单独的函数,再次怀疑它们的配合效果不佳。但是console.log
显示_onUserChange
的调用符合预期,但是_onEventChange
从未被调用。这曾经工作!在master分支(我一直链接到分支的拉取请求)中,它起作用了!那里的一切结构都有些不同–我一直链接到的控制器视图仅侦听
UserStore
中的更改,而其子组件侦听EventStore
中的更改。但是,如果我复制此结构,它仍然无法正常工作。在我的新分支中,无论哪个组件正在监听EventStore
的更改,似乎都完全听不见此类更改。同样在
master
上,EventStore
进行的计算比现在多得多。但是,我非常怀疑它缓慢会使其听众听到它的可能性更大。 UserStore
相当简单,它的听众也没问题。有时它确实起作用。每100张纸可加载约1页,它可以正常工作。该组件将更新其状态,并实际显示服务器加载的内容。我一直无法复制或确定是什么原因造成的。
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
调用放入构造函数中不会产生更好的结果。 最佳答案
我看到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
),看看是否可以解决您的问题!
关于javascript - React View 无法成功监听存储,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31367463/