• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1"use strict";
2module.exports = function(Promise) {
3var util = require("./util");
4var async = Promise._async;
5var tryCatch = util.tryCatch;
6var errorObj = util.errorObj;
7
8function spreadAdapter(val, nodeback) {
9    var promise = this;
10    if (!util.isArray(val)) return successAdapter.call(promise, val, nodeback);
11    var ret =
12        tryCatch(nodeback).apply(promise._boundValue(), [null].concat(val));
13    if (ret === errorObj) {
14        async.throwLater(ret.e);
15    }
16}
17
18function successAdapter(val, nodeback) {
19    var promise = this;
20    var receiver = promise._boundValue();
21    var ret = val === undefined
22        ? tryCatch(nodeback).call(receiver, null)
23        : tryCatch(nodeback).call(receiver, null, val);
24    if (ret === errorObj) {
25        async.throwLater(ret.e);
26    }
27}
28function errorAdapter(reason, nodeback) {
29    var promise = this;
30    if (!reason) {
31        var newReason = new Error(reason + "");
32        newReason.cause = reason;
33        reason = newReason;
34    }
35    var ret = tryCatch(nodeback).call(promise._boundValue(), reason);
36    if (ret === errorObj) {
37        async.throwLater(ret.e);
38    }
39}
40
41Promise.prototype.asCallback = Promise.prototype.nodeify = function (nodeback,
42                                                                     options) {
43    if (typeof nodeback == "function") {
44        var adapter = successAdapter;
45        if (options !== undefined && Object(options).spread) {
46            adapter = spreadAdapter;
47        }
48        this._then(
49            adapter,
50            errorAdapter,
51            undefined,
52            this,
53            nodeback
54        );
55    }
56    return this;
57};
58};
59