An open API service indexing awesome lists of open source software.

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

Awesome Lists containing this project

README

          

# Pure Saga

![Build](https://img.shields.io/travis/rumkin/pure-saga.svg)

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.