pure-saga
v3.5.12
Published
Functional implementation of redux-saga alike asynchronous flow manager
Downloads
11
Maintainers
Readme
Pure Saga
Pure saga is a functional implementation of generator based asynchronous flow manager based on effects yielding. It has been inspired with redux-saga.
Installation
Via npm:
npm i pure-saga
Or via unpkg.com:
<script src="https://unpkg.com/pure-saga@3/dist/pure-saga.js"></script>
<script src="https://unpkg.com/pure-saga@3/dist/pure-saga.min.js"></script>
Usage
Pure-saga allows developer to define custom effects to implement any behavior.
It has pretty simple interface createSaga(generatorFunc, sagaEffects)
. This
function returns promisified saga generator. See example below of how to use it.
Example
This example shows how to create API for saga like this:
import {createSaga} from 'pure-saga';
// Side effects handlers get instructions generated by factories and produce
// result. Side effect could return promises.
const effectHandlers = {
api: ({method, args}) => api[method](...args),
storagePut: ({id, item}) => storage.set(id, item),
storageGet: ({id, item}) => storage.get(id),
};
// Define some goodies for easy effect creation.
const createEffect = (type, payload) => ({type, payload});
// Effects factory
const effects = {
api: (method, ...args) => createEffect('api', {method, args}),
storage: {
put: (id, item) => createEffect('storagePut', {id, item}),
get: (id) => createEffect('storageGet', {id}),
},
};
// Example saga generator function
function * loadUserSaga(userId) {
// Retrieve user calling api.loadUser method
const user = yield effects.api('loadUser', userId);
// Put user to storage
yield effects.storage.put(user.id, user);
}
// Create method
const loadUser = createSaga(loadUserSaga, effectHandlers);
// Use it
loadUser(1)
.catch((error) => console.error(error));
Testing
Test example.
function * getUserSaga() {
const user = yield effect.get('user');
return user;
}
describe('getUserSaga', () => {
it('Should yield `get` effect', () => {
const it = getUserSaga();
const effect = it.next().value;
// Check effect to be an instanceof get effect.
should(effect).be.deepEqual({
type: 'get',
payload: {
key: 'user',
},
});
const user = {name: 'user'};
const result = it.next(user).value;
should(result).be.deepEqual(user);
});
});
License
MIT.