En *function() { ... } er egentlig bare en funksjon som returnerer en iterator
Den pauses ved hver yield. Man må kalle next() før den går videre. Dersom man
kaller next(verdi) fortsetter kjøringen og utrykket blir erstattet med verdien.
*functionser stegvis funksjonerasync/awaitfor iteratorer.- ECMAScript 6
Er en forutsigbar måte å håndtere tilstand i JS applikasjoner.
- Sentralisert/global
- Event-dreven
- Kø basert
- Lett å debugge
- God "separation of concerns"
Man bruker ofte sagas på backend uten å tenke så mye over det. En saga er egentlig
bare en langt-levende transaksjon. En AWS Step-function er et eksempel på noe som
typisk faller inn under definisjonen. I sammenheng med Redux er det egentlig bare det
samme. Altså en stegvis funksjon som vi bruker for å håndtere side-effects som følge
av redux eventer.
- Snugg fit med
*functions - En oppskrift på noe som skal utføres
- Blir ferdig en eller annen gang
- Kjører parallelt med andre sagas
- Lett å skrive/lese
- Lett å teste
- Gjenbrukbar
- God "separation of concerns"
import { call, put } from 'redux-saga/effects'
import Api from '...'
const iterator = fetchProducts()
// expects a call instruction
assert.deepEqual(
iterator.next().value,
call(Api.fetch, '/products'),
"fetchProducts should yield an Effect call(Api.fetch, './products')"
)
// create a fake error
const error = {}
// expects a dispatch instruction
assert.deepEqual(
iterator.throw(error).value,
put({ type: 'PRODUCTS_REQUEST_FAILED', error }),
"fetchProducts should yield an Effect put({ type: 'PRODUCTS_REQUEST_FAILED', error })"
)