Sha256: e33ea098a91d2c41be886fbbcecacb9799fe183d8a446f138a4786cb3d809802

Contents?: true

Size: 1.33 KB

Versions: 292

Compression:

Stored size: 1.33 KB

Contents

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)

    // XXX It's somewhat ambiguous whether a new callback added in this
    // pass should be queued for later execution if something in the
    // list of callbacks throws, or if it should just be discarded.
    // However, it's such an edge case that it hardly matters, and either
    // choice is likely as surprising as the other.
    // As it happens, we do go ahead and schedule it for later execution.
    try {
      for (var i = 0; i < len; i++) {
        cbs[i].apply(null, args)
      }
    } finally {
      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
}

Version data entries

292 entries across 269 versions & 33 rubygems

Version Path
rapid_stack-0.1.1 templates/FrontEnd/node_modules/inflight/inflight.js
rapid_stack-0.1.0 templates/FrontEnd/node_modules/inflight/inflight.js
immosquare-cleaner-0.1.60 node_modules/inflight/inflight.js
immosquare-cleaner-0.1.59 node_modules/inflight/inflight.js
immosquare-cleaner-0.1.58 node_modules/inflight/inflight.js
immosquare-cleaner-0.1.57 node_modules/inflight/inflight.js
immosquare-cleaner-0.1.56 node_modules/inflight/inflight.js
immosquare-cleaner-0.1.55 node_modules/inflight/inflight.js
immosquare-cleaner-0.1.54 node_modules/inflight/inflight.js
immosquare-cleaner-0.1.53 node_modules/inflight/inflight.js
immosquare-cleaner-0.1.52 node_modules/inflight/inflight.js
trusty-cms-6.3.1 node_modules/inflight/inflight.js
immosquare-cleaner-0.1.51 node_modules/inflight/inflight.js
boring_generators-0.15.0 tmp/templates/app_template/node_modules/inflight/inflight.js
immosquare-cleaner-0.1.50 node_modules/inflight/inflight.js
immosquare-cleaner-0.1.49 node_modules/inflight/inflight.js
immosquare-cleaner-0.1.48 node_modules/inflight/inflight.js
immosquare-cleaner-0.1.47 node_modules/inflight/inflight.js
immosquare-cleaner-0.1.46 node_modules/inflight/inflight.js
immosquare-cleaner-0.1.45 node_modules/inflight/inflight.js