Sha256: 29d3cccddc7148f48715bfc94eb6f7b9f9132a5ecb704b9d4b713de87e7603dd

Contents?: true

Size: 1.64 KB

Versions: 107

Compression:

Stored size: 1.64 KB

Contents

/*!
 * ee-first
 * Copyright(c) 2014 Jonathan Ong
 * MIT Licensed
 */

'use strict'

/**
 * Module exports.
 * @public
 */

module.exports = first

/**
 * Get the first event in a set of event emitters and event pairs.
 *
 * @param {array} stuff
 * @param {function} done
 * @public
 */

function first(stuff, done) {
  if (!Array.isArray(stuff))
    throw new TypeError('arg must be an array of [ee, events...] arrays')

  var cleanups = []

  for (var i = 0; i < stuff.length; i++) {
    var arr = stuff[i]

    if (!Array.isArray(arr) || arr.length < 2)
      throw new TypeError('each array member must be [ee, events...]')

    var ee = arr[0]

    for (var j = 1; j < arr.length; j++) {
      var event = arr[j]
      var fn = listener(event, callback)

      // listen to the event
      ee.on(event, fn)
      // push this listener to the list of cleanups
      cleanups.push({
        ee: ee,
        event: event,
        fn: fn,
      })
    }
  }

  function callback() {
    cleanup()
    done.apply(null, arguments)
  }

  function cleanup() {
    var x
    for (var i = 0; i < cleanups.length; i++) {
      x = cleanups[i]
      x.ee.removeListener(x.event, x.fn)
    }
  }

  function thunk(fn) {
    done = fn
  }

  thunk.cancel = cleanup

  return thunk
}

/**
 * Create the event listener.
 * @private
 */

function listener(event, done) {
  return function onevent(arg1) {
    var args = new Array(arguments.length)
    var ee = this
    var err = event === 'error'
      ? arg1
      : null

    // copy args to prevent arguments escaping scope
    for (var i = 0; i < args.length; i++) {
      args[i] = arguments[i]
    }

    done(err, ee, event, args)
  }
}

Version data entries

107 entries across 106 versions & 19 rubygems

Version Path
rapid_stack-0.2.0 templates/frontend/node_modules/ee-first/index.js
rapid_stack-0.1.1 templates/FrontEnd/node_modules/ee-first/index.js
rapid_stack-0.1.0 templates/FrontEnd/node_modules/ee-first/index.js
sumomo-0.10.8 data/sumomo/api_modules/node_modules/ee-first/index.js
optimacms-0.1.61 spec/dummy/node_modules/ee-first/index.js
sumomo-0.10.4 data/sumomo/api_modules/node_modules/ee-first/index.js
sumomo-0.10.3 data/sumomo/api_modules/node_modules/ee-first/index.js
sumomo-0.10.2 data/sumomo/api_modules/node_modules/ee-first/index.js
sumomo-0.10.1 data/sumomo/api_modules/node_modules/ee-first/index.js
sumomo-0.10.0 data/sumomo/api_modules/node_modules/ee-first/index.js
sumomo-0.9.0 data/sumomo/api_modules/node_modules/ee-first/index.js
sumomo-0.8.22 data/sumomo/api_modules/node_modules/ee-first/index.js
sumomo-0.8.21 data/sumomo/api_modules/node_modules/ee-first/index.js
sumomo-0.8.20 data/sumomo/api_modules/node_modules/ee-first/index.js
sumomo-0.8.17 data/sumomo/api_modules/node_modules/ee-first/index.js
sumomo-0.8.16 data/sumomo/api_modules/node_modules/ee-first/index.js
disco_app-0.18.0 test/dummy/node_modules/ee-first/index.js
disco_app-0.18.2 test/dummy/node_modules/ee-first/index.js
sumomo-0.8.15 data/sumomo/api_modules/node_modules/ee-first/index.js
disco_app-0.16.1 test/dummy/node_modules/ee-first/index.js