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