| 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
 | | 'use strict' |  |   |  | module.exports.disposer = disposer |  |   |  | function disposer (creatorFn, disposerFn, fn) { |  |   const runDisposer = (resource, result, shouldThrow = false) => { |  |     return disposerFn(resource) |  |       .then( |  |         // disposer resolved, do something with original fn's promise |  |         () => { |  |           if (shouldThrow) |  |             throw result |  |   |  |           return result |  |         }, |  |         // Disposer fn failed, crash process |  |         (err) => { |  |           throw err |  |           // Or process.exit? |  |         }) |  |   } |  |   |  |   return creatorFn |  |     .then((resource) => { |  |       // fn(resource) can throw, so wrap in a promise here |  |       return Promise.resolve().then(() => fn(resource)) |  |         .then((result) => runDisposer(resource, result)) |  |         .catch((err) => runDisposer(resource, err, true)) |  |     }) |  | } | 
 |