2015-03-02 45 views
0

我有一个Calendar组件,当使用某个称为LoadOnMount的道具呈现时,需要呼叫服务器加载一组航班。处理多个异步通话与flux

的问题是,我通过聆听CalendarStoreEvents.UPDATE事件,这是由我的调度员派遣UPDATE_CALENDAR动作触发更新日历,和我加载使用一套名为LOAD_FLIGHT_LIST另一个动作的航班。所以当我从Calendar组件的ComponentDidMount函数调用这个新动作时,我得到了cannot dispatch in the middle of a dispatch错误。

任何方式来处理这些类型的依赖? (日历也从服务器获得的)

+0

您是否在等待2个或更多异步调用您的组件中的商店?如果我理解正确,看起来你正在尝试两次安装组件。这不起作用。如果这是我使用'''componentWillRecieveProps'''或'''shouldComponentUpdate'''建议的问题。在这里你要确保你从两个异步调用中获得信息。 (因为你对两个呼叫都使用相同的事件)。纠正我,如果我误解你的问题。 – magnudae 2015-03-02 13:53:15

+0

对不起,我可能对我的问题措辞不好:我只安装一次组件,但它需要两次调用服务器才能获取其数据,如果某些条件为真,但按照特定顺序。 也许这个问题更好地解释它:https://github.com/facebook/flux/issues/168 – nicohvi 2015-03-03 07:53:01

+0

您的异步调用是在同一时间调度还是可以连续执行? – magnudae 2015-03-03 09:57:29

回答

1

你有,我可以找出两个问题:

第一个是,你试图让调度员期间调度派遣。这不是你应该这样做的方式。

第二个是你似乎在里面的你的调度处理程序正在执行AJAX /异步调用。我不想说你永远不应该这样做,但在你的应用程序中这似乎不是必需的。

这里是另一个堆栈溢出的问题,我认为是类似的链接:https://stackoverflow.com/a/23637463/2152216

不同的是,提问者正试图从他的调度处理程序中执行一个Ajax调用,而你似乎在试图调度这个事件会在事件处理期间触发ajax调用。

你可以做的是创建一个动作,异步加载航班列表,然后发送FLIGHT_LIST_LOADED动作,然后传递获取的航班列表。您的商店应该处理此操作并为所有组件观察者广播更改事件。

我希望你明白我在说什么。如果您认为我误解了您的问题,请告诉我。

+0

我的问题是类似的,但在问题中,他只需要处理*一个* AJAX调用(我可以做得很好),而不是*两个*(这是我遇到问题的地方)。假设我想在我的调度处理程序中进行AJAX调用,或者 - 更确切地说 - 我希望处理程序**启动** AJAX调用,您是正确的。你的建议是好的(我已经考虑过这样做),但是如果**没有在实际的调度处理程序中,你如何建议我触发操作来加载航班列表? – nicohvi 2015-03-04 10:17:26

+0

我会触发异步调用中的动作。该操作接收异步呼叫的结果(航班列表)。因此,您应该在日历组件的componentWillMount方法中调用该调用,并在回调中触发该操作。 – 2015-03-04 10:24:37

+0

好吧,组件并不知道这个调用,因为它是通过Actions单例抽象出来的。第一个动作在其“成功”处理程序中接收数据,这是正确的 - 但该处理程序**也**调度“UPDATE_CALENDAR”事件。因此,如果我像你所建议的那样,在成功处理程序中触发** second **动作,那么我将遇到同样的调度问题(因为不能保证UPDATE_CALENDAR将在'LOAD_FLIGHT_LIST'事件被分派)。 – nicohvi 2015-03-04 10:49:29