2016-08-04 32 views
0

Redux Sagas Beginner Tutorial告訴我們寫一個守望者傳奇是這樣的:產量*委託運營

export function* watchIncrementAsync() { 
    yield* takeEvery('INCREMENT_ASYNC', incrementAsync) 
} 

爲什麼我們使用yield*委託運營商在第2行而不只是yield操作的?他們都不會在這裏做同樣的事嗎?

+3

我猜'takeEvery'返回一個迭代器和'yield *'委託給這個迭代器。一個正常的'yield'只會將這個迭代器返回給調用者。 – ftor

+0

將迭代器返回給調用者的缺點是什麼?無論哪種方式,迭代器都會運行,直到耗盡,這就是我想要發生的事情。 – AjaxLeung

+0

調用者似乎自動調用生成器。也許這是Redux Sagas特有的行爲。 – AjaxLeung

回答

0

正如LUH3417所說,takeEver是一個生成器,所以在這種情況下你可以屈服(委託給它)。從文檔:

function* takeEvery(pattern, saga, ...args) { 
    while (true) { 
    const action = yield take(pattern) 
    yield fork(saga, ...args.concat(action)) 
    } 
} 

我的猜測是關於控制流。如果你的迭代器不關心除了takeEvery之外的任何其他事情,那麼我就沒有看到你需要完全控制流量的原因。如果您的生成器需要將控制權交給另一個生成器,然後回來,那麼我會看到將控制權交給了...的價值......但在您的示例中,我沒有看到代碼原因,您爲什麼需要委派來接管。如果我不正確,請告訴我。

+0

這似乎沒有回答我的問題。我不需要委託給發電機的發電機仍然運行,所以**爲什麼不**只是使用'yield'? – AjaxLeung

+0

我的猜測是關於控制流。如果你的迭代器不關心除了takeEvery之外的任何其他事情,那麼我就沒有看到你需要完全控制流量的原因。如果您的生成器需要將控制權交給另一個生成器,然後回來,那麼我會看到將控制權交給了...的價值......但在您的示例中,我沒有看到代碼原因,您爲什麼需要委派來接管。如果我不正確,請告訴我。 –

0

這兩個環節可能有助於解釋:
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操作,它將立即調用子任務,並且它們將並行執行並解析。

使用takeLatesttakeEvery的不同之處在於它取消了先前的開始新請求的請求。

+0

鏈接已經死了,你能否提供替代請求? – Marecky