inflight.js 897 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. var wrappy = require('wrappy')
  2. var reqs = Object.create(null)
  3. var once = require('once')
  4. module.exports = wrappy(inflight)
  5. function inflight (key, cb) {
  6. if (reqs[key]) {
  7. reqs[key].push(cb)
  8. return null
  9. } else {
  10. reqs[key] = [cb]
  11. return makeres(key)
  12. }
  13. }
  14. function makeres (key) {
  15. return once(function RES () {
  16. var cbs = reqs[key]
  17. var len = cbs.length
  18. var args = slice(arguments)
  19. for (var i = 0; i < len; i++) {
  20. cbs[i].apply(null, args)
  21. }
  22. if (cbs.length > len) {
  23. // added more in the interim.
  24. // de-zalgo, just in case, but don't call again.
  25. cbs.splice(0, len)
  26. process.nextTick(function () {
  27. RES.apply(null, args)
  28. })
  29. } else {
  30. delete reqs[key]
  31. }
  32. })
  33. }
  34. function slice (args) {
  35. var length = args.length
  36. var array = []
  37. for (var i = 0; i < length; i++) array[i] = args[i]
  38. return array
  39. }