Skip to content

Instantly share code, notes, and snippets.

@lykkin
Last active February 11, 2016 22:24
Show Gist options
  • Save lykkin/8d4c231c26ec947aa44a to your computer and use it in GitHub Desktop.
Save lykkin/8d4c231c26ec947aa44a to your computer and use it in GitHub Desktop.
async stuff
function joinCalls(doneAfter, callback) {
var counter = 0
return function wrapped() {
if (++counter === doneAfter) callback()
}
}
function joinCallsSingleValue(doneAfter, joinValuesFn, callback) {
var counter = 0
var result = null
return function wrapped() {
result = joinValuesFn.bind(null, result).apply(null, arguments)
if (++counter === doneAfter) callback(result)
}
}
var runner = {
tasks: {},
register: function register(key, fn) {
if (this.tasks[key] === undefined) this.tasks[key] = []
this.tasks[key].push(fn)
},
run: function run(key, callback) {
var fns = this.tasks[key]
callback = joinCalls(fns.length, callback)
for (var i = 0; i < fns.length; i++) {
fns[i](callback)
}
},
runSingleValue: function runSingleValue(key, joinValuesFn, callback) {
var fns = this.tasks[key]
callback = joinCallsSingleValue(fns.length, joinValuesFn, callback)
for (var i = 0; i < fns.length; i++) {
fns[i](callback)
}
}
}
runner.register('test', function (callback) {
setImmediate(function () {
callback('hello ', 1)
})
})
runner.register('test', function (callback) {
setImmediate(function () {
callback('world', 2)
})
})
runner.run('test', function () {
console.log('i should be called once')
})
runner.runSingleValue('test', function joinValues(results, str, i) {
if (results === null) results = ''
return results += str + i
}, console.log)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment