| 64 | } = undefined |
| 65 | |
| 66 | const fn = (...args: T): Promise<U> => { |
| 67 | if (!state) { |
| 68 | state = {} as any |
| 69 | state!.promise = new Promise((resolve, reject) => { |
| 70 | state!.resolve = resolve |
| 71 | state!.reject = reject |
| 72 | }) |
| 73 | } |
| 74 | clearTimeout(state!.timeout) |
| 75 | state!.latestArgs = args |
| 76 | // It's up to the consumer of debounce to call `cancel` |
| 77 | // eslint-disable-next-line no-restricted-globals |
| 78 | state!.timeout = setTimeout(() => { |
| 79 | const s = state! |
| 80 | state = undefined |
| 81 | try { |
| 82 | s.resolve(callback(...s.latestArgs)) |
| 83 | } catch (e) { |
| 84 | s.reject(e) |
| 85 | } |
| 86 | }, wait) |
| 87 | |
| 88 | return state!.promise |
| 89 | } |
| 90 | fn.cancel = () => { |
| 91 | if (!state) return |
| 92 | clearTimeout(state.timeout) |