Skip to content

Instantly share code, notes, and snippets.

@tgroshon
Last active September 1, 2019 14:34
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save tgroshon/561e19147169d1d0e341 to your computer and use it in GitHub Desktop.
Save tgroshon/561e19147169d1d0e341 to your computer and use it in GitHub Desktop.
A Flux Dispatcher with an Action Queue sitting on top to allow dispatching actions at any time.
/**
* Create an ActionQueue and dispatch each synchronously
* @author tgroshon
*
* See an alternate implementation using ASync from
* https://github.com/facebook/flux/issues/106
* by fabiozaffani
*/
import {Dispatcher} from 'flux'
var dispatcher = new Dispatcher()
var actionQueue = []
var isProcessing = false
function queueAction(payload) {
actionQueue.push(payload)
if (!isProcessing) {
startProcessing()
}
}
function startProcessing() {
isProcessing = true
while (actionQueue.length > 0) {
if (dispatcher.isDispatching()) {
return setTimeout(startProcessing, 100) // Be safe; Avoid an Invariant error from Flux
}
var payload = actionQueue.shift()
dispatcher.dispatch(payload)
}
isProcessing = false
}
var AppDispatcher = {
isProcessing() {
return isProcessing
},
dispatch(payload) {
queueAction(payload)
},
register(callback) {
return dispatcher.register(callback)
}
}
module.exports = AppDispatcher
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment