To generalize, triggering Side Effects from inside a Saga is always done by yielding some declarative Effect. (You can also yield Promise directly, but this will make testing difficult as we saw in the first section.)
What a Saga does is actually compose all those Effects together to implement the desired control flow. The most basic example is to sequence yielded Effects by putting the yields one after another. You can also use the familiar control flow operators (
for) to implement more sophisticated control flows.
We saw that using Effects like
put, combined with high-level APIs like
takeEvery allows us to achieve the same things as
redux-thunk, but with the added benefit of easy testability.
redux-saga provides another advantage over
redux-thunk. In the Advanced section you'll encounter some more powerful Effects that let you express complex control flows while still allowing the same testability benefit.