‘liusuyi’
2023-10-21 94023628bd9c5e6bf724c37371a19b60d338b291
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
31
32
33
34
35
36
37
38
39
'use strict';
const mimicFn = require('mimic-fn');
 
module.exports = (fn, opts) => {
    // TODO: Remove this in v3
    if (opts === true) {
        throw new TypeError('The second argument is now an options object');
    }
 
    if (typeof fn !== 'function') {
        throw new TypeError('Expected a function');
    }
 
    opts = opts || {};
 
    let ret;
    let called = false;
    const fnName = fn.displayName || fn.name || '<anonymous>';
 
    const onetime = function () {
        if (called) {
            if (opts.throw === true) {
                throw new Error(`Function \`${fnName}\` can only be called once`);
            }
 
            return ret;
        }
 
        called = true;
        ret = fn.apply(this, arguments);
        fn = null;
 
        return ret;
    };
 
    mimicFn(onetime, fn);
 
    return onetime;
};