promiseOrCallback.js 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. 'use strict';
  2. const PromiseProvider = require('../promise_provider');
  3. const emittedSymbol = Symbol.for('mongoose:emitted');
  4. module.exports = function promiseOrCallback(callback, fn, ee) {
  5. if (typeof callback === 'function') {
  6. return fn(function(error) {
  7. if (error != null) {
  8. if (ee != null && ee.listeners('error').length > 0 && !error[emittedSymbol]) {
  9. error[emittedSymbol] = true;
  10. ee.emit('error', error);
  11. }
  12. try {
  13. callback(error);
  14. } catch (error) {
  15. return process.nextTick(() => {
  16. throw error;
  17. });
  18. }
  19. return;
  20. }
  21. callback.apply(this, arguments);
  22. });
  23. }
  24. const Promise = PromiseProvider.get();
  25. return new Promise((resolve, reject) => {
  26. fn(function(error, res) {
  27. if (error != null) {
  28. if (ee != null && ee.listeners('error').length > 0 && !error[emittedSymbol]) {
  29. error[emittedSymbol] = true;
  30. ee.emit('error', error);
  31. }
  32. return reject(error);
  33. }
  34. if (arguments.length > 2) {
  35. return resolve(Array.prototype.slice.call(arguments, 1));
  36. }
  37. resolve(res);
  38. });
  39. });
  40. };