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));