Skip to content

Commit 88056be

Browse files
authoredJul 28, 2022
Add .off() method for events (#2092)
1 parent c41a98a commit 88056be

File tree

4 files changed

+72
-0
lines changed

4 files changed

+72
-0
lines changed
 

‎documentation/1-promise.md

+25
Original file line numberDiff line numberDiff line change
@@ -89,3 +89,28 @@ Whether the promise is canceled.
8989
### `promise.on(event, handler)`
9090

9191
The events are the same as in [Stream API](3-streams.md#events).
92+
93+
### `promise.off(event, handler)`
94+
95+
Removes listener registered with [`promise.on`](1-promise.md#promiseonevent-handler)
96+
97+
```js
98+
import {createReadStream} from 'node:fs';
99+
import got from 'got';
100+
101+
const ongoingRequestPromise = got.post(uploadUrl, {
102+
body: createReadStream('sample.txt')
103+
});
104+
105+
const eventListener = (progress: Progress) => {
106+
console.log(progress);
107+
};
108+
109+
ongoingRequestPromise.on('uploadProgress', eventListener);
110+
111+
setTimeout(() => {
112+
ongoingRequestPromise.off('uploadProgress', eventListener);
113+
}, 500);
114+
115+
await ongoingRequestPromise;
116+
```

‎source/as-promise/index.ts

+5
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,11 @@ export default function asPromise<T>(firstRequest?: Request): CancelableRequest<
170170
return promise;
171171
};
172172

173+
promise.off = (event: string, fn: (...args: any[]) => void) => {
174+
emitter.off(event, fn);
175+
return promise;
176+
};
177+
173178
const shortcut = <T>(responseType: Options['responseType']): CancelableRequest<T> => {
174179
const newPromise = (async () => {
175180
// Wait until downloading has ended

‎source/core/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ export type GotEventFunction<T> =
117117
export interface RequestEvents<T> {
118118
on: GotEventFunction<T>;
119119
once: GotEventFunction<T>;
120+
off: GotEventFunction<T>;
120121
}
121122

122123
export type CacheableRequestFunction = (

‎test/progress.ts

+41
Original file line numberDiff line numberDiff line change
@@ -221,3 +221,44 @@ test('upload progress - no body', withServer, async (t, server, got) => {
221221
},
222222
]);
223223
});
224+
225+
test('upload progress - no events when immediatly removed listener', withServer, async (t, server, got) => {
226+
server.post('/', uploadEndpoint);
227+
228+
const events: Progress[] = [];
229+
230+
const listener = (event: Progress) => events.push(event);
231+
232+
const promise = got.post('')
233+
.on('uploadProgress', listener)
234+
.off('uploadProgress', listener);
235+
236+
await promise;
237+
238+
t.is(events.length, 0);
239+
});
240+
241+
test('upload progress - one event when removed listener', withServer, async (t, server, got) => {
242+
server.post('/', uploadEndpoint);
243+
244+
const events: Progress[] = [];
245+
246+
const promise = got.post('');
247+
248+
const listener = (event: Progress) => {
249+
events.push(event);
250+
void promise.off('uploadProgress', listener);
251+
};
252+
253+
void promise.on('uploadProgress', listener);
254+
255+
await promise;
256+
257+
t.deepEqual(events, [
258+
{
259+
percent: 0,
260+
transferred: 0,
261+
total: undefined,
262+
},
263+
]);
264+
});

0 commit comments

Comments
 (0)
Please sign in to comment.