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))
| })
| }
|
|