簡體   English   中英

我什么時候應該在 redux-saga 中使用 yield* 與 yield?

[英]When should I use yield* vs yield in redux-saga?

我想從一個傳奇中調用另一個傳奇。

傳奇當然是一個生成器函數,並且是異步的。

我應該使用yield yield *還是應該始終使用yield

function* mySaga({ payload: { id, name } }) {
    yield myOtherAsyncSaga(); // when to use yield *?
}

傳奇當然是一個生成器函數,並且是異步的。
我應該使用產量*還是應該總是使用產量?

完全回答一個問題,首先有必要理解為saga,中間件,流程管理器和生成器功能通常是有效的。 事實上, redux-saga實現了兩個方面:用於redux存儲的中間件,用於攔截和注入自定義操作,以及異步進程管理器 ,它具有自己的tick回調域並幫助執行異步操作。

接下來,每個客戶端實現的傳奇函數都只是效果創建者 事實上,客戶端傳奇函數是以這樣的方式實現的,它實際上沒有做任何事情,但是效果創建 - calltakeput等等。此外,saga本質上不是同步或異步 - 它只是將一些行為委托給saga進程管理器,並執行請求的操作 - 例如,等待承諾。
當然,您可以在客戶端傳奇中手動執行promise / async處理,但此類操作將從saga事件周期中刪除。

所以, redux-saga內部需要從客戶端傳奇只是一個迭代器 ,它返回適當的效果,並可能在閉包激活上下文中存儲一些信息 - 如果是while(true) - 就像saga進程一樣。 因此,在redux-saga沒有用例,其中yield *是必需的,正弦yield *只是將后續迭代器重新委托給上層。

域名注冊地址:

  • 在JS中,沒關系
  • 在 TS 中,始終使用yield*進行正確的類型解析

如果你在 JS 領域, yield給中間件一個 Generator,中間件會自動迭代它。 如果您使用yield* ,則您正在迭代生成器並將所有項目生成給中間件。 在這種情況下沒有區別。

使用 TypeScript 時,情況會發生一些變化: yield意味着生成器的迭代將發生在中間件中,因此我們的類型將不正確。 如果我們改為使用yield* ,迭代將發生在我們的作用域上,TS 將能夠檢測到正確的類型。

有一個小的 TS 庫可以更好地說明這一點: https : //www.npmjs.com/package/typed-redux-saga

暫無
暫無

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

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