events-once.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. 'use strict';
  2. var common = require('./common');
  3. var EventEmitter = require('../').EventEmitter;
  4. var once = require('../').once;
  5. var assert = require('assert');
  6. function onceAnEvent() {
  7. var ee = new EventEmitter();
  8. process.nextTick(function () {
  9. ee.emit('myevent', 42);
  10. });
  11. return once(ee, 'myevent').then(function (args) {
  12. var value = args[0]
  13. assert.strictEqual(value, 42);
  14. assert.strictEqual(ee.listenerCount('error'), 0);
  15. assert.strictEqual(ee.listenerCount('myevent'), 0);
  16. });
  17. }
  18. function onceAnEventWithTwoArgs() {
  19. var ee = new EventEmitter();
  20. process.nextTick(function () {
  21. ee.emit('myevent', 42, 24);
  22. });
  23. return once(ee, 'myevent').then(function (value) {
  24. assert.strictEqual(value.length, 2);
  25. assert.strictEqual(value[0], 42);
  26. assert.strictEqual(value[1], 24);
  27. });
  28. }
  29. function catchesErrors() {
  30. var ee = new EventEmitter();
  31. var expected = new Error('kaboom');
  32. var err;
  33. process.nextTick(function () {
  34. ee.emit('error', expected);
  35. });
  36. return once(ee, 'myevent').then(function () {
  37. throw new Error('should reject')
  38. }, function (err) {
  39. assert.strictEqual(err, expected);
  40. assert.strictEqual(ee.listenerCount('error'), 0);
  41. assert.strictEqual(ee.listenerCount('myevent'), 0);
  42. });
  43. }
  44. function stopListeningAfterCatchingError() {
  45. var ee = new EventEmitter();
  46. var expected = new Error('kaboom');
  47. var err;
  48. process.nextTick(function () {
  49. ee.emit('error', expected);
  50. ee.emit('myevent', 42, 24);
  51. });
  52. // process.on('multipleResolves', common.mustNotCall());
  53. return once(ee, 'myevent').then(common.mustNotCall, function (err) {
  54. // process.removeAllListeners('multipleResolves');
  55. assert.strictEqual(err, expected);
  56. assert.strictEqual(ee.listenerCount('error'), 0);
  57. assert.strictEqual(ee.listenerCount('myevent'), 0);
  58. });
  59. }
  60. function onceError() {
  61. var ee = new EventEmitter();
  62. var expected = new Error('kaboom');
  63. process.nextTick(function () {
  64. ee.emit('error', expected);
  65. });
  66. return once(ee, 'error').then(function (args) {
  67. var err = args[0]
  68. assert.strictEqual(err, expected);
  69. assert.strictEqual(ee.listenerCount('error'), 0);
  70. assert.strictEqual(ee.listenerCount('myevent'), 0);
  71. });
  72. }
  73. Promise.all([
  74. onceAnEvent(),
  75. onceAnEventWithTwoArgs(),
  76. catchesErrors(),
  77. stopListeningAfterCatchingError(),
  78. onceError()
  79. ]).catch(function (err) {
  80. console.error(err.stack)
  81. process.exit(1)
  82. });