events: add once method to use promises with EventEmitter · nodejs/node@df55731 (original) (raw)

``

1

`+

'use strict';

`

``

2

+

``

3

`+

const common = require('../common');

`

``

4

`+

const { once, EventEmitter } = require('events');

`

``

5

`+

const { strictEqual, deepStrictEqual } = require('assert');

`

``

6

+

``

7

`+

async function onceAnEvent() {

`

``

8

`+

const ee = new EventEmitter();

`

``

9

+

``

10

`+

process.nextTick(() => {

`

``

11

`+

ee.emit('myevent', 42);

`

``

12

`+

});

`

``

13

+

``

14

`+

const [value] = await once(ee, 'myevent');

`

``

15

`+

strictEqual(value, 42);

`

``

16

`+

strictEqual(ee.listenerCount('error'), 0);

`

``

17

`+

strictEqual(ee.listenerCount('myevent'), 0);

`

``

18

`+

}

`

``

19

+

``

20

`+

async function onceAnEventWithTwoArgs() {

`

``

21

`+

const ee = new EventEmitter();

`

``

22

+

``

23

`+

process.nextTick(() => {

`

``

24

`+

ee.emit('myevent', 42, 24);

`

``

25

`+

});

`

``

26

+

``

27

`+

const value = await once(ee, 'myevent');

`

``

28

`+

deepStrictEqual(value, [42, 24]);

`

``

29

`+

}

`

``

30

+

``

31

`+

async function catchesErrors() {

`

``

32

`+

const ee = new EventEmitter();

`

``

33

+

``

34

`+

const expected = new Error('kaboom');

`

``

35

`+

let err;

`

``

36

`+

process.nextTick(() => {

`

``

37

`+

ee.emit('error', expected);

`

``

38

`+

});

`

``

39

+

``

40

`+

try {

`

``

41

`+

await once(ee, 'myevent');

`

``

42

`+

} catch (_e) {

`

``

43

`+

err = _e;

`

``

44

`+

}

`

``

45

`+

strictEqual(err, expected);

`

``

46

`+

strictEqual(ee.listenerCount('error'), 0);

`

``

47

`+

strictEqual(ee.listenerCount('myevent'), 0);

`

``

48

`+

}

`

``

49

+

``

50

`+

async function stopListeningAfterCatchingError() {

`

``

51

`+

const ee = new EventEmitter();

`

``

52

+

``

53

`+

const expected = new Error('kaboom');

`

``

54

`+

let err;

`

``

55

`+

process.nextTick(() => {

`

``

56

`+

ee.emit('error', expected);

`

``

57

`+

ee.emit('myevent', 42, 24);

`

``

58

`+

});

`

``

59

+

``

60

`+

process.on('multipleResolves', common.mustNotCall());

`

``

61

+

``

62

`+

try {

`

``

63

`+

await once(ee, 'myevent');

`

``

64

`+

} catch (_e) {

`

``

65

`+

err = _e;

`

``

66

`+

}

`

``

67

`+

process.removeAllListeners('multipleResolves');

`

``

68

`+

strictEqual(err, expected);

`

``

69

`+

strictEqual(ee.listenerCount('error'), 0);

`

``

70

`+

strictEqual(ee.listenerCount('myevent'), 0);

`

``

71

`+

}

`

``

72

+

``

73

`+

async function onceError() {

`

``

74

`+

const ee = new EventEmitter();

`

``

75

+

``

76

`+

const expected = new Error('kaboom');

`

``

77

`+

process.nextTick(() => {

`

``

78

`+

ee.emit('error', expected);

`

``

79

`+

});

`

``

80

+

``

81

`+

const [err] = await once(ee, 'error');

`

``

82

`+

strictEqual(err, expected);

`

``

83

`+

strictEqual(ee.listenerCount('error'), 0);

`

``

84

`+

strictEqual(ee.listenerCount('myevent'), 0);

`

``

85

`+

}

`

``

86

+

``

87

`+

Promise.all([

`

``

88

`+

onceAnEvent(),

`

``

89

`+

onceAnEventWithTwoArgs(),

`

``

90

`+

catchesErrors(),

`

``

91

`+

stopListeningAfterCatchingError(),

`

``

92

`+

onceError()

`

``

93

`+

]);

`