【问题标题】:React view not successfully listening to store反应视图未成功收听商店
【发布时间】:2015-09-30 18:41:09
【问题描述】:

我有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.logs 表明_onUserChange 被按预期调用,但_onEventChange 根本没有被调用。
  • 这曾经有效!在我一直链接到分支的拉取请求的主分支中,它有效!一切的结构都有些不同,我一直链接到的控制器视图只监听UserStore 的变化,而它的子组件监听EventStore 的变化。但是,如果我复制这个结构,它仍然不起作用。在我的新分支中,任何正在监听 EventStore 更改的组件似乎对这些更改完全置若罔闻。
  • 同样在masterEventStore 上进行了比现在更多的计算。不过,我非常怀疑它的缓慢是否会让它的听众更有可能听到它。 UserStore 也同样简单,听众听着也没有问题。
  • 有时它确实工作。大约 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 已经加载数据之前还是之后最初呈现的)。
  • EventStore 中的get events() 方法更改为常规events() 无效。
  • EventService.fetchEvents 调用放在setTimeout 中不会产生更好的结果。
  • listen 调用放在构造函数中不会产生更好的结果。

【问题讨论】:

  • 会不会是缓存导致某些东西同步运行?我会将addChangeListener 调用添加到之前 两个服务调用。
  • 感谢@BinaryMuse。我应该提到我也尝试过。无济于事。 :-( 刚刚我第一次尝试时,三分之二的页面加载确实有效!但后来我又刷新了十几次,它始终无法加载。le sigh
  • 您是否尝试过切换这些语句出现的顺序?如果 EventService 真的是一个动作创建者,那么您很可能处于这样一种情况,即在商店准备好响应之前引发了动作事件。换个顺序值得一试。
  • @HalHelms 请参阅之前的 cmets。是的,我试过了。
  • 我更新了代码以反映你们俩建议的更改。感谢您的建议!不幸的是,它仍然不起作用。 ????

标签: javascript reactjs reactjs-flux


【解决方案1】:

我看到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),看看是否能解决您的问题!

【讨论】:

  • 就是这样!实际上,我决定使用 Flux 的 alt 变体,它避免了这个问题,而且遗憾的是,它使你的所有链接都指向不相关的东西。但是我创建了一个单独的拉取请求,其中 your suggested fix 作为历史记录。很棒的发现!
猜你喜欢
  • 2016-12-21
  • 1970-01-01
  • 2021-10-17
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
  • 2016-09-09
  • 1970-01-01
  • 2011-08-09
相关资源
最近更新 更多