2016-05-18 65 views
5

我想用終極版下面的異步邏輯模型:我應該在Redux中編寫複雜的異步流程?

  1. 用戶操作觸發的異步API調用鏈。
  2. 任何API調用可能會返回401種狀態(登錄超時)
  3. 如果API與401的響應,顯示重新登錄彈出
  4. 在成功重新登錄,補發API調用,並繼續

我我不確定把這個邏輯放在哪裏。行動不知道其他行動,他們只能訪問派遣,所以他們不能停下來等待他們完成。減速機無法進入調度,所以我不能把它放在那裏...所以它住在哪裏?自定義中間件? store.listen?在智能組件中?

我目前使用的終極版,承諾中間件&終極版-的thunk。如何最好地組織這種類型的流程 - 而不需要買入像redux-saga或redux-rx之類的東西?

還不能確定最佳的透明中斷API調用來執行這些其他操作即API調用應該不會觸發它的完成或失敗的操作,直到可選的登錄過程完成後的方式。

回答

1

這聽起來好像你想要一個動作的創造者,其產生咚,並保持所有的邏輯在咚。實際上沒有其他好方法可以保留您的API調用套件之間的關聯,並確保在其中一個失敗時取消所有其他關聯。

  1. 在這種咚,你會解僱你的API調用,並收集他們的承諾:

    const call1 = promiseGenerator1(); 
    const call2 = promiseGenerator2(); 
    const call3 = promiseGenerator3(); 
    const allCallPromises = [call1, call2, call3]; 
    
  2. 使用一個all()承諾處理程序,以監控他們:

    const watcher = Promise.all(allCallPromises).then(allSuccess, anyFail); 
    
  3. 你故障處理程序:

    • 取消其他承諾,如果其中任何401的。 (請注意,這需要像藍鳥庫,有取消的語義,或者你的諾言/請求增強的一些其他形式。)
    • 派遣一個動作或路徑切換到觸發重新登錄窗口

      anyFail(error) => { 
          if (error.status === 401) { 
           allCallPromises.forEach((item)=> {item.cancel();}); 
           reLogin(); 
          } 
      } 
      
  4. 然後,我傾向於讓你的relogin組件擔心再次發射同樣複雜的動作,以發出所有的調用。

  5. 但是,如果您的套接字API調用是某種變體或特定於上下文的,則可以在存儲器中緩存您需要的那些內容,即從anyFail處理程序中緩存。有一個減速器,您可以存放actionPendingReLogin。撰寫的動作,將重新火一樣的調用是最後一次,然後派遣它:

    dispatch(createAction('CACHE_RELOGIN_ACTION`, actionObjectToSaveForLater)); 
    

    (或者,只是你使用的任何行動的創建者緩存。)

    然後,在成功重新登錄,您可以:

    const action = store.getState('actionPendingReLogin'); 
    dispatch(action); 
    // or: 
    const actionCreator = store.getState('actionPendingReLogin'); 
    dispatch(actionCreator()); 
    

哦:在你allSuccess處理你只是分派異步調用的結果。