Skip to content

Instantly share code, notes, and snippets.

@tingwei628
Forked from zspecza/sequentialCallback.js
Created November 20, 2016 06:38
Show Gist options
  • Save tingwei628/4b8adeff9049d23e09d9b12c384e453a to your computer and use it in GitHub Desktop.
Save tingwei628/4b8adeff9049d23e09d9b12c384e453a to your computer and use it in GitHub Desktop.
function sequentialCallback (...fns) {
return (...args) => {
const done = args.pop()
const next = (error, ...args) => {
if (error) return done(error)
if (fns.length) {
const fn = fns.shift()
return fn(...args, next)
}
return done(null, ...args)
}
return next(null, ...args)
}
}
@tingwei628
Copy link
Author

const getValidatedTransformation = sequentialCallback(
  findSomething,
  transformSomething,
  validateTransformed
)

getValidatedTransformation((error, validated) => {
  if (error) {
    console.error(new Error(error))
  } else {
    console.log('data is valid:', validated) 
  }
})

@tingwei628
Copy link
Author

Another form

var _slice = [].slice
  
  function sequentialCallback () {
    var fns = _slice.call(arguments)
    return function () {
      var args = _slice.call(arguments)
      var done = args.pop()
      var next = function () {
        var args = _slice.call(arguments)
        var error = args.shift()
        if (error) return done(error)
        if (fns.length) {
          var fn = fns.shift()
          return fn.apply(null, args.concat([next]))
        }
        return done.apply(null, [null].concat(args))
      }
      return next.apply(null, [null].concat(args))
    }
  }

@tingwei628
Copy link
Author

Compared to the form with Promise

findSomething()
  .then(transformSomething)
  .then(validateTransformed)
  .then((validated) => console.log('data is valid:', validated))
  .catch((error) => console.error(new Error(error))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment