blob: 0dc343d9398965bccf83dbfea09ac1a2f45b4f6a (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
# event-kit
This is a simple library for implementing event subscription APIs.
## Implementing Event Subscription APIs
```coffee
{Emitter} = require 'event-kit'
class User
constructor: ->
@emitter = new Emitter
onDidChangeName: (callback) ->
@emitter.on 'did-change-name', callback
setName: (name) ->
if name isnt @name
@name = name
@emitter.emit 'did-change-name', name
@name
destroy: ->
@emitter.dispose()
```
In the example above, we implement `::onDidChangeName` on the user object, which
will register callbacks to be invoked whenever the user's name changes. To do
so, we make use of an internal `Emitter` instance. We use `::on` to subscribe
the given callback in `::onDidChangeName`, and `::emit` in `::setName` to notify
subscribers. Finally, when the `User` instance is destroyed we call `::dispose`
on the emitter to unsubscribe all subscribers.
## Consuming Event Subscription APIs
`Emitter::on` returns a `Disposable` instance, which has a `::dispose` method.
To unsubscribe, simply call dispose on the returned object.
```coffee
subscription = user.onDidChangeName (name) -> console.log("My name is #{name}")
# Later, to unsubscribe...
subscription.dispose()
```
You can also use `CompositeDisposable` to combine disposable instances together.
```coffee
{CompositeDisposable} = require 'event-kit'
subscriptions = new CompositeDisposable
subscriptions.add user1.onDidChangeName (name) -> console.log("User 1: #{name}")
subscriptions.add user2.onDidChangeName (name) -> console.log("User 2: #{name}")
# Later, to unsubscribe from *both*...
subscriptions.dispose()
```
## Creating Your Own Disposables
Disposables are convenient ways to represent a resource you will no longer
need at some point. You can instantiate a disposable with an action to take when
no longer needed.
```coffee
{Disposable} = require 'event-kit'
disposable = new Disposable => @destroyResource()
```
|