All Projects → oreshinya → actionizer

oreshinya / actionizer

Licence: MIT License
Simple pub/sub for data flow like Redux.

Programming Languages

javascript
184084 projects - #8 most used programming language

Projects that are alternatives of or similar to actionizer

SHOPMATE
front-end e-commerce system
Stars: ✭ 12 (-42.86%)
Mutual labels:  redux-saga
httpubsub
Basic Pub/Sub over HTTP/S
Stars: ✭ 22 (+4.76%)
Mutual labels:  pubsub
react-bus
A global event emitter for react.
Stars: ✭ 34 (+61.9%)
Mutual labels:  pubsub
php-pubsub
A PHP abstraction for the pub-sub pattern
Stars: ✭ 36 (+71.43%)
Mutual labels:  pubsub
Fakeflix
Not the usual clone that you can find on the web.
Stars: ✭ 4,429 (+20990.48%)
Mutual labels:  redux-saga
react-native-boilerplate-starter-app
📱🚀A POWERFUL React Native starter kit to bootstrap the start of your mobile app development
Stars: ✭ 202 (+861.9%)
Mutual labels:  redux-saga
build-your-own-platform-with-knative
Knativeのコンポーネントを理解しながらFaaSプラットフォームをDIYするワークショップです
Stars: ✭ 43 (+104.76%)
Mutual labels:  pubsub
redux-saga-controller
A tool to simplify work with react, redux and redux-saga
Stars: ✭ 18 (-14.29%)
Mutual labels:  redux-saga
svelte-local-storage-store
Adds pub/sub to local storage.
Stars: ✭ 194 (+823.81%)
Mutual labels:  pubsub
frontend-boilerplate
Boilerplate to create powerful frontend applications
Stars: ✭ 17 (-19.05%)
Mutual labels:  redux-saga
bntp
A chrome extension providing Bookmarks in the New Tab Page
Stars: ✭ 37 (+76.19%)
Mutual labels:  redux-saga
shamash
Autoscaling for Google Cloud Dataproc
Stars: ✭ 31 (+47.62%)
Mutual labels:  pubsub
react-menu-monkey-client
Frontend for a recipe box website
Stars: ✭ 59 (+180.95%)
Mutual labels:  redux-saga
redux-saga
繁體中文 redux-saga 文件翻譯:
Stars: ✭ 39 (+85.71%)
Mutual labels:  redux-saga
next-saga-example
Example of using next.js with redux saga
Stars: ✭ 24 (+14.29%)
Mutual labels:  redux-saga
eslint-config-adjunct
A reasonable collection of plugins to use alongside your main esLint configuration
Stars: ✭ 39 (+85.71%)
Mutual labels:  redux-saga
quantum-blox
Quantum blox - modular UI boilerplate in react
Stars: ✭ 12 (-42.86%)
Mutual labels:  redux-saga
OverWatchTeams
react+redux+redux-saga+axios
Stars: ✭ 23 (+9.52%)
Mutual labels:  redux-saga
event-bus
Typesafe cross-platform pubsub event bus ensuring reliable communication between fragments and micro frontends.
Stars: ✭ 15 (-28.57%)
Mutual labels:  pubsub
opal
Policy and data administration, distribution, and real-time updates on top of Open Policy Agent
Stars: ✭ 459 (+2085.71%)
Mutual labels:  pubsub

Actionizer

npm version Build Status

This is just pub/sub for data flow like Redux.

Overview


  Command -> (Web API)
    ^  _________|
    |  v
   Action -> Command -> (Reducer) -> Store -> View
     ^                                         |
     |_________________________________________|

Dependencies

babel-polyfill for ES2015 generator.

Installation

$ npm i --save actionizer

Usage

import 'babel-polyfill';
import axios from 'axios';
import { fromJS } from 'immutable';
import { createStore } from 'actionizer';
import { select, call, reduce, fork, cancel, delegate } from 'actionizer/commands';
import debounce from 'lodash.debounce';

const initialState = fromJS({
  counter: 0,
  items: {
    1: {id: 1, name: 'hoge'},
    2: {id: 2, name: 'fuga'}
  }
});

// Customize notifier.
const notify = debounce((emit) => { emit(); });

// Create "Store", it treats states for the app.
const store = createStore(initialState, notify);

// Define "Reducer"
const setCount = (state, num) => state.set('counter', num);

// Define "Action Creator".
const count = function*(num) {
  // Get current state.
  const state = yield select();

  // Update state by "Reducer"
  yield reduce(setCount, num);
}

// API request.
const getItems = (id, field) => {
  return axios.get('/items', {id, field});
};

// Define asynchronous "Action Creator".
const fetchItems = function*(id, field) {
  try {
    // "call" receives a function and arguments that returns a promise.
    const result = yield call(getItems, id, field);

    // Do something...
  } catch(e) {
    // Do something...
  }
}

const sleep = (ms) => {
  return new Promise((resolve) => {
    setTimeout(() => { resolve(); }, ms);
  });
};

// Define debounced "Action Creator".
const debouncedFetchItems = function*(id) {
  yield call(sleep, 1000);
  // Delegate other action creator
  yield delegate(fetchItems, id);
}
let actionId;
const searchItemsById = function*(id) {
  yield cancel(actionId);
  actionId = yield fork(debouncedFetchItems, id);
}

// Subscribe store's change.
const unsubscribe = store.subscribe((state) => {
  console.log(`listener: ${state.get('counter')}`);
});

// Dispatch "Action".
store.dispatch(count(100));

// => listener: 100

// Unsubscribe store's change.
unsubscribe();

API

Top level API

createStore(initialState, notify)

Create a store.

compose(...funcs)

Composes functions from right to left.

Store API

subscribe(listener)

Register a listener of store's changes. And it returns unsubscriber.

dispatch(action, callback)

Trigger an action. In Actionizer, "Action" is a generator like:

// This is "Action Creator"
const count = function*(num) {
  yield reduce(setCount, num);
}

// This is "Action"
const action = count(1);

getState()

Get store's state.

Command API

"Command" return a payload used in "Action Creator".

select(selector = (state) => state)

select calls selector with current state, and return selector result.

reduce(reducer, ...args)

reduce updates state by result of reducer.

call(fn, ...args)

call calls fn with args. fn should return Promise. call returns resolved value.

fork(actionCreator, ...args)

fork calls an action without blocking and returns action id. Action id is unique.

delegate(actionCreator, ...args)

delegate delegates process to other action by calling action creator.

cancel(actionId)

cancel cancels action by action id.

Related projects

LICENSE

MIT

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].