You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					47 lines
				
				1.3 KiB
			
		
		
			
		
	
	
					47 lines
				
				1.3 KiB
			| 
											3 years ago
										 | 'use strict'; | ||
|  | 
 | ||
|  | const PromiseProvider = require('../promise_provider'); | ||
|  | const immediate = require('./immediate'); | ||
|  | 
 | ||
|  | const emittedSymbol = Symbol('mongoose:emitted'); | ||
|  | 
 | ||
|  | module.exports = function promiseOrCallback(callback, fn, ee, Promise) { | ||
|  |   if (typeof callback === 'function') { | ||
|  |     return fn(function(error) { | ||
|  |       if (error != null) { | ||
|  |         if (ee != null && ee.listeners != null && ee.listeners('error').length > 0 && !error[emittedSymbol]) { | ||
|  |           error[emittedSymbol] = true; | ||
|  |           ee.emit('error', error); | ||
|  |         } | ||
|  |         try { | ||
|  |           callback(error); | ||
|  |         } catch (error) { | ||
|  |           return immediate(() => { | ||
|  |             throw error; | ||
|  |           }); | ||
|  |         } | ||
|  |         return; | ||
|  |       } | ||
|  |       callback.apply(this, arguments); | ||
|  |     }); | ||
|  |   } | ||
|  | 
 | ||
|  |   Promise = Promise || PromiseProvider.get(); | ||
|  | 
 | ||
|  |   return new Promise((resolve, reject) => { | ||
|  |     fn(function(error, res) { | ||
|  |       if (error != null) { | ||
|  |         if (ee != null && ee.listeners != null && ee.listeners('error').length > 0 && !error[emittedSymbol]) { | ||
|  |           error[emittedSymbol] = true; | ||
|  |           ee.emit('error', error); | ||
|  |         } | ||
|  |         return reject(error); | ||
|  |       } | ||
|  |       if (arguments.length > 2) { | ||
|  |         return resolve(Array.prototype.slice.call(arguments, 1)); | ||
|  |       } | ||
|  |       resolve(res); | ||
|  |     }); | ||
|  |   }); | ||
|  | }; |