root / HServer / 00.Server / 00.Program / node_modules / inflight / inflight.js
이력 | 보기 | 이력해설 | 다운로드 (1.33 KB)
| 1 |
var wrappy = require('wrappy') |
|---|---|
| 2 |
var reqs = Object.create(null) |
| 3 |
var once = require('once') |
| 4 |
|
| 5 |
module.exports = wrappy(inflight) |
| 6 |
|
| 7 |
function inflight (key, cb) { |
| 8 |
if (reqs[key]) {
|
| 9 |
reqs[key].push(cb) |
| 10 |
return null |
| 11 |
} else {
|
| 12 |
reqs[key] = [cb] |
| 13 |
return makeres(key)
|
| 14 |
} |
| 15 |
} |
| 16 |
|
| 17 |
function makeres (key) { |
| 18 |
return once(function RES () { |
| 19 |
var cbs = reqs[key]
|
| 20 |
var len = cbs.length
|
| 21 |
var args = slice(arguments) |
| 22 |
|
| 23 |
// XXX It's somewhat ambiguous whether a new callback added in this
|
| 24 |
// pass should be queued for later execution if something in the
|
| 25 |
// list of callbacks throws, or if it should just be discarded.
|
| 26 |
// However, it's such an edge case that it hardly matters, and either
|
| 27 |
// choice is likely as surprising as the other.
|
| 28 |
// As it happens, we do go ahead and schedule it for later execution.
|
| 29 |
try {
|
| 30 |
for (var i = 0; i < len; i++) { |
| 31 |
cbs[i].apply(null, args)
|
| 32 |
} |
| 33 |
} finally {
|
| 34 |
if (cbs.length > len) {
|
| 35 |
// added more in the interim.
|
| 36 |
// de-zalgo, just in case, but don't call again.
|
| 37 |
cbs.splice(0, len)
|
| 38 |
process.nextTick(function () {
|
| 39 |
RES.apply(null, args)
|
| 40 |
}) |
| 41 |
} else {
|
| 42 |
delete reqs[key]
|
| 43 |
} |
| 44 |
} |
| 45 |
}) |
| 46 |
} |
| 47 |
|
| 48 |
function slice (args) { |
| 49 |
var length = args.length
|
| 50 |
var array = []
|
| 51 |
|
| 52 |
for (var i = 0; i < length; i++) array[i] = args[i] |
| 53 |
return array
|
| 54 |
} |