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.
		
		
		
		
		
			
		
			
				
					78 lines
				
				1.9 KiB
			
		
		
			
		
	
	
					78 lines
				
				1.9 KiB
			| 
											3 years ago
										 | 
 | ||
|  | var Promise = require('any-promise') | ||
|  | var assert = require('assert') | ||
|  | 
 | ||
|  | module.exports = thenify | ||
|  | 
 | ||
|  | /** | ||
|  |  * Turn async functions into promises | ||
|  |  * | ||
|  |  * @param {Function} fn | ||
|  |  * @return {Function} | ||
|  |  * @api public | ||
|  |  */ | ||
|  | 
 | ||
|  | function thenify(fn, options) { | ||
|  |   assert(typeof fn === 'function') | ||
|  |   return createWrapper(fn, options) | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * Turn async functions into promises and backward compatible with callback | ||
|  |  * | ||
|  |  * @param {Function} fn | ||
|  |  * @return {Function} | ||
|  |  * @api public | ||
|  |  */ | ||
|  | 
 | ||
|  | thenify.withCallback = function (fn, options) { | ||
|  |   assert(typeof fn === 'function') | ||
|  |   options = options || {} | ||
|  |   options.withCallback = true | ||
|  |   return createWrapper(fn, options) | ||
|  | } | ||
|  | 
 | ||
|  | function createCallback(resolve, reject, multiArgs) { | ||
|  |   // default to true
 | ||
|  |   if (multiArgs === undefined) multiArgs = true | ||
|  |   return function(err, value) { | ||
|  |     if (err) return reject(err) | ||
|  |     var length = arguments.length | ||
|  | 
 | ||
|  |     if (length <= 2 || !multiArgs) return resolve(value) | ||
|  | 
 | ||
|  |     if (Array.isArray(multiArgs)) { | ||
|  |       var values = {} | ||
|  |       for (var i = 1; i < length; i++) values[multiArgs[i - 1]] = arguments[i] | ||
|  |       return resolve(values) | ||
|  |     } | ||
|  | 
 | ||
|  |     var values = new Array(length - 1) | ||
|  |     for (var i = 1; i < length; ++i) values[i - 1] = arguments[i] | ||
|  |     resolve(values) | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | function createWrapper(fn, options) { | ||
|  |   options = options || {} | ||
|  |   var name = fn.name; | ||
|  |   name = (name || '').replace(/\s|bound(?!$)/g, '') | ||
|  |   var newFn = function () { | ||
|  |     var self = this | ||
|  |     var len = arguments.length | ||
|  |     if (options.withCallback) { | ||
|  |       var lastType = typeof arguments[len - 1] | ||
|  |       if (lastType === 'function') return fn.apply(self, arguments) | ||
|  |     } | ||
|  |     var args = new Array(len + 1) | ||
|  |     for (var i = 0; i < len; ++i) args[i] = arguments[i] | ||
|  |     var lastIndex = i | ||
|  |     return new Promise(function (resolve, reject) { | ||
|  |       args[lastIndex] = createCallback(resolve, reject, options.multiArgs) | ||
|  |       fn.apply(self, args) | ||
|  |     }) | ||
|  |   } | ||
|  |   Object.defineProperty(newFn, 'name', { value: name }) | ||
|  |   return newFn | ||
|  | } |