在Redux Sagas Beginner Tutorial告訴我們寫一個守望者傳奇是這樣的:產量*委託運營
export function* watchIncrementAsync() {
yield* takeEvery('INCREMENT_ASYNC', incrementAsync)
}
爲什麼我們使用yield*
委託運營商在第2行而不只是yield
操作的?他們都不會在這裏做同樣的事嗎?
在Redux Sagas Beginner Tutorial告訴我們寫一個守望者傳奇是這樣的:產量*委託運營
export function* watchIncrementAsync() {
yield* takeEvery('INCREMENT_ASYNC', incrementAsync)
}
爲什麼我們使用yield*
委託運營商在第2行而不只是yield
操作的?他們都不會在這裏做同樣的事嗎?
正如LUH3417所說,takeEver是一個生成器,所以在這種情況下你可以屈服(委託給它)。從文檔:
function* takeEvery(pattern, saga, ...args) {
while (true) {
const action = yield take(pattern)
yield fork(saga, ...args.concat(action))
}
}
我的猜測是關於控制流。如果你的迭代器不關心除了takeEvery之外的任何其他事情,那麼我就沒有看到你需要完全控制流量的原因。如果您的生成器需要將控制權交給另一個生成器,然後回來,那麼我會看到將控制權交給了...的價值......但在您的示例中,我沒有看到代碼原因,您爲什麼需要委派來接管。如果我不正確,請告訴我。
這似乎沒有回答我的問題。我不需要委託給發電機的發電機仍然運行,所以**爲什麼不**只是使用'yield'? – AjaxLeung
我的猜測是關於控制流。如果你的迭代器不關心除了takeEvery之外的任何其他事情,那麼我就沒有看到你需要完全控制流量的原因。如果您的生成器需要將控制權交給另一個生成器,然後回來,那麼我會看到將控制權交給了...的價值......但在您的示例中,我沒有看到代碼原因,您爲什麼需要委派來接管。如果我不正確,請告訴我。 –
這兩個環節可能有助於解釋:
http://yelouafi.github.io/redux-saga/docs/advanced/ComposingSagas.html
http://yelouafi.github.io/redux-saga/docs/advanced/SequencingSagas.html(其實我加入這本頁面今天)
從譜寫英雄傳奇:
yield*
只允許任務的順序組合,所以你一次只能產生*到一個發生器
我仍然試圖自己琢磨這一切,但也許yield*
與takeEvery
意味着隨着每個後續INCREMENT_ASYNC
操作,它會調用子任務(在您的示例中爲incrementAsync
),但是一旦前一個子任務解決,就會按順序執行。如果您要使用yield
,那麼對於每個INCREMENT_ASYNC
操作,它將立即調用子任務,並且它們將並行執行並解析。
使用takeLatest
與takeEvery
的不同之處在於它取消了先前的開始新請求的請求。
鏈接已經死了,你能否提供替代請求? – Marecky
我猜'takeEvery'返回一個迭代器和'yield *'委託給這個迭代器。一個正常的'yield'只會將這個迭代器返回給調用者。 – ftor
將迭代器返回給調用者的缺點是什麼?無論哪種方式,迭代器都會運行,直到耗盡,這就是我想要發生的事情。 – AjaxLeung
調用者似乎自動調用生成器。也許這是Redux Sagas特有的行爲。 – AjaxLeung