45 lines
897 B
JavaScript
45 lines
897 B
JavaScript
|
var wrappy = require('wrappy')
|
||
|
var reqs = Object.create(null)
|
||
|
var once = require('once')
|
||
|
|
||
|
module.exports = wrappy(inflight)
|
||
|
|
||
|
function inflight (key, cb) {
|
||
|
if (reqs[key]) {
|
||
|
reqs[key].push(cb)
|
||
|
return null
|
||
|
} else {
|
||
|
reqs[key] = [cb]
|
||
|
return makeres(key)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function makeres (key) {
|
||
|
return once(function RES () {
|
||
|
var cbs = reqs[key]
|
||
|
var len = cbs.length
|
||
|
var args = slice(arguments)
|
||
|
for (var i = 0; i < len; i++) {
|
||
|
cbs[i].apply(null, args)
|
||
|
}
|
||
|
if (cbs.length > len) {
|
||
|
// added more in the interim.
|
||
|
// de-zalgo, just in case, but don't call again.
|
||
|
cbs.splice(0, len)
|
||
|
process.nextTick(function () {
|
||
|
RES.apply(null, args)
|
||
|
})
|
||
|
} else {
|
||
|
delete reqs[key]
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
|
||
|
function slice (args) {
|
||
|
var length = args.length
|
||
|
var array = []
|
||
|
|
||
|
for (var i = 0; i < length; i++) array[i] = args[i]
|
||
|
return array
|
||
|
}
|