58 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "use strict";
 | |
| module.exports = function(Promise) {
 | |
| var util = require("./util.js");
 | |
| var async = require("./async.js");
 | |
| var tryCatch = util.tryCatch;
 | |
| var errorObj = util.errorObj;
 | |
| 
 | |
| function spreadAdapter(val, nodeback) {
 | |
|     var promise = this;
 | |
|     if (!util.isArray(val)) return successAdapter.call(promise, val, nodeback);
 | |
|     var ret = tryCatch(nodeback).apply(promise._boundTo, [null].concat(val));
 | |
|     if (ret === errorObj) {
 | |
|         async.throwLater(ret.e);
 | |
|     }
 | |
| }
 | |
| 
 | |
| function successAdapter(val, nodeback) {
 | |
|     var promise = this;
 | |
|     var receiver = promise._boundTo;
 | |
|     var ret = val === undefined
 | |
|         ? tryCatch(nodeback).call(receiver, null)
 | |
|         : tryCatch(nodeback).call(receiver, null, val);
 | |
|     if (ret === errorObj) {
 | |
|         async.throwLater(ret.e);
 | |
|     }
 | |
| }
 | |
| function errorAdapter(reason, nodeback) {
 | |
|     var promise = this;
 | |
|     if (!reason) {
 | |
|         var target = promise._target();
 | |
|         var newReason = target._getCarriedStackTrace();
 | |
|         newReason.cause = reason;
 | |
|         reason = newReason;
 | |
|     }
 | |
|     var ret = tryCatch(nodeback).call(promise._boundTo, reason);
 | |
|     if (ret === errorObj) {
 | |
|         async.throwLater(ret.e);
 | |
|     }
 | |
| }
 | |
| 
 | |
| Promise.prototype.nodeify = function (nodeback, options) {
 | |
|     if (typeof nodeback == "function") {
 | |
|         var adapter = successAdapter;
 | |
|         if (options !== undefined && Object(options).spread) {
 | |
|             adapter = spreadAdapter;
 | |
|         }
 | |
|         this._then(
 | |
|             adapter,
 | |
|             errorAdapter,
 | |
|             undefined,
 | |
|             this,
 | |
|             nodeback
 | |
|         );
 | |
|     }
 | |
|     return this;
 | |
| };
 | |
| };
 |