59 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
"use strict";
 | 
						|
module.exports = function(Promise) {
 | 
						|
var util = require("./util");
 | 
						|
var async = Promise._async;
 | 
						|
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._boundValue(), [null].concat(val));
 | 
						|
    if (ret === errorObj) {
 | 
						|
        async.throwLater(ret.e);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
function successAdapter(val, nodeback) {
 | 
						|
    var promise = this;
 | 
						|
    var receiver = promise._boundValue();
 | 
						|
    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 newReason = new Error(reason + "");
 | 
						|
        newReason.cause = reason;
 | 
						|
        reason = newReason;
 | 
						|
    }
 | 
						|
    var ret = tryCatch(nodeback).call(promise._boundValue(), reason);
 | 
						|
    if (ret === errorObj) {
 | 
						|
        async.throwLater(ret.e);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
Promise.prototype.asCallback = 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;
 | 
						|
};
 | 
						|
};
 |