2015-03-02 69 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