Skip to content

Instantly share code, notes, and snippets.

@choonkeat
Created January 26, 2021 23:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save choonkeat/b1d089cdb3df72e87c46472047e20749 to your computer and use it in GitHub Desktop.
Save choonkeat/b1d089cdb3df72e87c46472047e20749 to your computer and use it in GitHub Desktop.
var waitall = {
defer: [],
final: null
}
// will make sure to call `waitall.final` when all `waitall.defer` has cleared
function defer (fn) {
waitall.defer.push(fn)
return function (...args) {
var result = fn(...args)
waitall.defer.shift() // self
if (waitall.final && waitall.defer.length === 0) {
setTimeout(waitall.final)
waitall.final = null // for re-used lambda, this resets the state for next invoke
}
return result
}
}
// ensure `fn` is called when `waitall.defer` is empty
function final (fn) {
waitall.final = fn
if (waitall.final && waitall.defer.length === 0) {
setTimeout(waitall.final)
waitall.final = null // for re-used lambda, this resets the state for next invoke
}
}
module.exports = { final, defer }
/**
const { final, defer } = require('./defer.js')
function dosomething (n) {
console.log(n, 'start')
setTimeout(defer(function () {
console.log(n, 'end')
}), n * 1000)
}
dosomething(1)
dosomething(2)
dosomething(3)
dosomething(4)
final(function () { console.log('exit') })
**/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment