| "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; |
| }; |
| }; |