Last active
February 11, 2016 22:24
-
-
Save lykkin/8d4c231c26ec947aa44a to your computer and use it in GitHub Desktop.
async stuff
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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