JSFiddle - React, Tailwind, and code Playground

by gianlucaguarini

JavaScript

ruit.CANCEL = Symbol()
ruit.cancel = () => ruit.CANCEL

function ruit(...actions) {
  return new Promise((resolve) => {
    return function run(result) {
      if (!actions.length) return resolve(result)

      const action = actions.shift()
      const value = typeof action === 'function' ? action(result) : action
      const done = (data) => run(data)

      if (value === ruit.CANCEL) return
      if (value.then) return value.then(done)
      
      return Promise.resolve(done(value))
    }()
  })
}
ruit(
  function() {
    return new Promise(r => {
      console.log('in1')
      setTimeout(r, 400, 1)
    })
  },
  function(num) {
    return new Promise((r) => {
      console.log('in2')
      setTimeout(r, 400, num + 1)
    })
  },
  function(num) {
    console.log('in3')
    return ruit.cancel()
  },
  function(num) {
    return new Promise(r => {
      console.log('in4')
      setTimeout(r, 400, num - 1)
    })
  }
).then(result => {
  console.log(result)
}, result => console.error('Promise rejected with error', result));