簡體   English   中英

使用 redux thunk 的動作創建者和普通的異步函數之間的區別

[英]Difference between an action creator using redux thunk and a normal async function

所以我想了解 Redux thunk 的基礎知識之外,我制作了兩個動作創建器,一個可以工作並使用 redux thunk,另一個只使用異步但中斷。下面是截圖:

截屏

因此,在兩個動作創建者中,我都等待 API 請求完成,然后返回一個動作(具有類型和負載的 JS 對象)。

但是,只有頂部一個有效,底部一個給出錯誤,指出 action 必須是普通對象,盡管我返回了一個具有 2 個屬性的普通對象。 我一直在努力理解為什么第二個動作創建者會剎車,如果有人能詳細解釋為什么會這樣,那就太好了。謝謝!

這是因為,當您使用 thunk 時,您將返回一個對象或函數。 dispatch(fetchUser())情況下,當您調度類似dispatch(fetchUser()) ,它沒有返回任何內容,因為您正在調用異步方法。 現在 await 下面的代碼只有在 async all 完成后才會執行,原始調用dispatch(fetchUser())已經完成(提示:只有 await 下面的代碼沒有執行,但函數調用已經結束),以及fetchUser()沒有返回任何對象,但在第一種情況下,您實際上正在返回一個調用異步方法的函數。 這就是 thunk 中間件的神奇之處。 它執行該函數並分派一個由 thunk 執行的動作(提示:您正在返回一個將分派作為參數的函數)。 希望這可以消除您的疑慮。 我建議您閱讀 async/await 的真正工作原理(提示:事件循環/單線程)。

你不能使用異步函數,因為它總是會返回一個承諾。 即使你返回一個值,它也會被包裝在一個承諾中並被返回。 如果在 async 函數中沒有返回任何內容並嘗試讀取值,則 undefined 將被包裝在一個 promise 中。 正如 redux 所說,動作創建者應該返回一個不能直接使用異步函數完成的普通對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM