https://github.com/rumkin/pure-saga
Functional implementation of redux-saga alike asynchronous flow manager
https://github.com/rumkin/pure-saga
async functional-js saga
Last synced: 9 months ago
JSON representation
Functional implementation of redux-saga alike asynchronous flow manager
- Host: GitHub
- URL: https://github.com/rumkin/pure-saga
- Owner: rumkin
- License: other
- Created: 2017-05-22T17:35:06.000Z (about 9 years ago)
- Default Branch: master
- Last Pushed: 2018-07-16T15:21:11.000Z (almost 8 years ago)
- Last Synced: 2024-11-20T17:45:31.570Z (over 1 year ago)
- Topics: async, functional-js, saga
- Language: JavaScript
- Size: 43.9 KB
- Stars: 3
- Watchers: 3
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: readme.md
- Changelog: changelog.md
- License: LICENSE
Awesome Lists containing this project
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:
```shell
npm i pure-saga
```
Or via unpkg.com:
```html
```
## 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:
```javascript
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.
```javascript
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.