1 | import Promise from 'bluebird';
|
2 |
|
3 | const cancelToken = Symbol('cancel token');
|
4 |
|
5 | const timeoutRefs = new WeakSet();
|
6 |
|
7 | const pause = delay => new Promise(r => setTimeout(r, delay));
|
8 |
|
9 | export const smartTimeout = (fn, delay = 0, ...args) => {
|
10 | const newToken = Symbol('cancel id');
|
11 | const checkRun = () => {
|
12 | if (timeoutRefs.has(newToken)) {
|
13 | timeoutRefs.delete(newToken);
|
14 | return fn(...args);
|
15 | } else return false;
|
16 | };
|
17 | const promise = pause(delay).then(checkRun);
|
18 | promise[cancelToken] = newToken;
|
19 | return promise;
|
20 | };
|
21 |
|
22 | smartTimeout.cancel = promise => {
|
23 | if (!promise || !promise[cancelToken]) return false;
|
24 | const token = promise[cancelToken];
|
25 | return timeoutRefs.has(token) ? timeoutRefs.delete(token) : false;
|
26 | };
|
27 |
|
28 | smartTimeout.immediate = (fn, ...args) => Promise.resolve().then(() => fn(...args));
|
29 |
|
30 | smartTimeout.promise = (fn, delay = 0, ...args) => pause(delay).then(() => fn(...args));
|
31 |
|
32 | export default smartTimeout;
|
33 |
|
\ | No newline at end of file |