• Stars
    star
    166
  • Rank 220,653 (Top 5 %)
  • Language
    JavaScript
  • Created over 8 years ago
  • Updated about 6 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Debounce middleware for Redux

Build Status npm

redux-debounce

Debounce middleware for Redux.

What's debounce?

Debounce allows you to discard a fast paced action from updating your state until a certain period of time passes after the last action is fired.

If you have a search that happens when someone types in a text box you can use this middleware to only fire your action after the user has stopped for a specified period of time.

$ npm install --save redux-debounced

Usage

First, add some debounce metadata to your actions using the Flux Standard Action pattern:

const action = {
  type: 'MY_ACTION',
  meta: {
    debounce: {
      time: 300
    }
  }
};

To enable Redux Debounce:

import { createStore, applyMiddleware } from 'redux';
import createDebounce from 'redux-debounced';
import rootReducer from './reducers/index';

// create a store that has redux-debounced middleware enabled
const createStoreWithMiddleware = applyMiddleware(
  createDebounce()
)(createStore);

const store = createStoreWithMiddleware(rootReducer);

You can also specify your own key rather than using the action type this is useful if you're already using a promise middleware.

Since promise middleware doesn't have a single type associated to it you can specify your own key for the middleware to keep track of your action being dispatched.

const action = {
  types: ['MY_ACTION_REQUEST', 'MY_ACTION_SUCCESS', 'MY_ACTION_FAILURE'],
  promise: () => {},
  meta: {
    debounce: {
      time: 300,
      key: 'myAction'
    }
  }
};

Leading or trailing debouncing

You can specify if the action should be dispatch on the leading and/or trailing edge of the debounce. This implementation is similar to the lodash _.debounce() method. By default, leading = false and trailing = true. If both values are set to false, the action will not be debounced.

const action = {
  type: 'MY_ACTION',
  meta: {
    debounce: {
      time: 300,
      // The action will be dispatched at the beginning of the debounce and not at the end
      leading: true,
      trailing: false
    }
  }
};

Cancelling a Debounced Action (Advanced)

If you need to cancel a debounced action, you can set the cancel flag to true:

const action = {
  type: 'MY_ACTION',
  meta: {
    debounce: {
      cancel: true
    }
  }
};

// OR

const otherAction = {
  type: 'CANCEL_OTHER_ACTION',
  meta: {
    debounce: {
      cancel: true,
      key: 'MY_ACTION'
    }
  }
}

This works in conjunction with the custom key metadata. This can be useful if one action may need to cancel another debounced action (e.g., a debounced API call that does not need to run if another action comes in).

Important - A cancel action will terminate in the middleware without propagating further. It will not show up DevTools or cause other side effects. So you cannot "piggyback" a cancel on another call at this time.

Debouncing a thunk

If you want to use redux-debounced with redux-thunk add the meta object as a property to the thunk function and the debounced middleware should be applied before the thunk middleware.

import { createStore, applyMiddleware } from 'redux';
import thunkMiddleware from 'redux-thunk';
import createDebounce from 'redux-debounced';

const store = createStore(
  rootReducer,
  applyMiddleware(createDebounce(), thunk)
);

export function trackCustomerSearch(key) {
  const thunk = dispatch => {
    console.log('Search Key ----> ', key);
  };
  thunk.meta = {
    debounce: {
      time: 2500,
      key: 'TRACK_CUSTOMER_SEARCH'
    }
  };
  return thunk;
}

Important - A key must be specified as the thunk has no type.

License

MIT License

More Repositories

1

react-frame-component

Render your React app to an iFrame
JavaScript
1,690
star
2

H5F

Deprecated, please use hyperform instead https://github.com/hyperform/hyperform
JavaScript
743
star
3

bunyip

Automate client-side unit testing in real browsers using the CLI
JavaScript
383
star
4

source-map

This is an unconnected fork of Mozilla's source-map library
JavaScript
224
star
5

60fps-scroll

Deprecated - A little library that *could* make your site scroll faster
JavaScript
213
star
6

slideshowbob

The evil, fumbling, JavaScript free, slide thingy
CSS
98
star
7

ScrollListView

Performant list view that re-uses cells to display large data sets
JavaScript
80
star
8

font-dragr

Drag and drop font testing
HTML
67
star
9

gulp-es6-module-transpiler

JavaScript
61
star
10

bootleg

Bootleg: Dodgy JavaScript free bootstrap plugins
HTML
60
star
11

earthin24

Source code for my twitter bot https://twitter.com/earthin24
Go
22
star
12

yeti-adaptors

Use Yeti with other client-side testing frameworks
JavaScript
18
star
13

sourcemap-onerror

Lookup original location from window.onerror by querying source map
JavaScript
18
star
14

web-components

A talk about web components. What they are and what they offer.
CSS
17
star
15

BrowserSocket

Create a socket server in the browser
JavaScript
15
star
16

sunrise-lifx

Simulate a sunrise effect using the Lifx ruby gem
Ruby
15
star
17

markdown-component

A Web Component to parse markdown to html
14
star
18

picture-component

<x-picture> element for responsive images
6
star
19

SUX

SUX.js a little JavaScript helper to expand short URLs
JavaScript
6
star
20

spaces-talk

Super serious talk on why spaces are the best and you're an idiot if you use tabs
JavaScript
6
star
21

FSA

JavaScript library to give you some helper methods to read and write files or directories using the new File API: Directories and System API
JavaScript
5
star
22

jemena-powershop

Jemena + powershop = almost realtime total power usage
JavaScript
4
star
23

solar-dashboard

A solar dashboard for the Adafruit MagTag
Python
4
star
24

slideshow-component

Every developer who does a talk on Web Components inevitably creates a slideshow component
4
star
25

flexbox-wds13

Flexbox talk for Web Diretions South 2013
JavaScript
3
star
26

travis-ci-templates

A series of templates to get you started with travis-ci integration in your repo
JavaScript
3
star
27

webcomponents-talk

The Composable Web with Web Components
CSS
2
star
28

es6-module-macro

ES6 Module macro that expands to commonjs
JavaScript
1
star
29

css-switch

A simple recreation of the iOS toggle switch using CSS
CSS
1
star
30

layouts

Demo jekyll templates for my projects
1
star
31

webpack-talk

A short look at webpack a module bundler for building web applications
CSS
1
star
32

dumplingsjs.com

Dumplings and JavaScript
1
star
33

bespoke-dir

Add a class to the slide parent element to let you know which direction the slides are going
JavaScript
1
star
34

source-map-workflows

A collection of workflows for client side apps that involve creating source maps
1
star