once.js (935B)
1 var wrappy = require('wrappy') 2 module.exports = wrappy(once) 3 module.exports.strict = wrappy(onceStrict) 4 5 once.proto = once(function () { 6 Object.defineProperty(Function.prototype, 'once', { 7 value: function () { 8 return once(this) 9 }, 10 configurable: true 11 }) 12 13 Object.defineProperty(Function.prototype, 'onceStrict', { 14 value: function () { 15 return onceStrict(this) 16 }, 17 configurable: true 18 }) 19 }) 20 21 function once (fn) { 22 var f = function () { 23 if (f.called) return f.value 24 f.called = true 25 return f.value = fn.apply(this, arguments) 26 } 27 f.called = false 28 return f 29 } 30 31 function onceStrict (fn) { 32 var f = function () { 33 if (f.called) 34 throw new Error(f.onceError) 35 f.called = true 36 return f.value = fn.apply(this, arguments) 37 } 38 var name = fn.name || 'Function wrapped with `once`' 39 f.onceError = name + " shouldn't be called more than once" 40 f.called = false 41 return f 42 }