singleton.js 648 B

1234567891011121314151617181920212223
  1. var has = require('./has');
  2. exports = function(fn) {
  3. var hashFn =
  4. arguments.length > 1 && arguments[1] !== undefined
  5. ? arguments[1]
  6. : JSON.stringify;
  7. var singleton = function() {
  8. var cache = singleton.cache;
  9. var address = hashFn.apply(this, arguments);
  10. if (has(cache, address)) {
  11. return cache[address];
  12. }
  13. var promise = fn.apply(this, arguments).finally(function() {
  14. delete cache[address];
  15. });
  16. cache[address] = promise;
  17. return promise;
  18. };
  19. singleton.cache = {};
  20. return singleton;
  21. };
  22. module.exports = exports;