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.
58 lines
1.6 KiB
58 lines
1.6 KiB
"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; |
|
}; |
|
};
|
|
|