• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1"use strict";
2module.exports = function(Promise, INTERNAL, tryConvertToPromise, debug) {
3var calledBind = false;
4var rejectThis = function(_, e) {
5    this._reject(e);
6};
7
8var targetRejected = function(e, context) {
9    context.promiseRejectionQueued = true;
10    context.bindingPromise._then(rejectThis, rejectThis, null, this, e);
11};
12
13var bindingResolved = function(thisArg, context) {
14    if (((this._bitField & 50397184) === 0)) {
15        this._resolveCallback(context.target);
16    }
17};
18
19var bindingRejected = function(e, context) {
20    if (!context.promiseRejectionQueued) this._reject(e);
21};
22
23Promise.prototype.bind = function (thisArg) {
24    if (!calledBind) {
25        calledBind = true;
26        Promise.prototype._propagateFrom = debug.propagateFromFunction();
27        Promise.prototype._boundValue = debug.boundValueFunction();
28    }
29    var maybePromise = tryConvertToPromise(thisArg);
30    var ret = new Promise(INTERNAL);
31    ret._propagateFrom(this, 1);
32    var target = this._target();
33    ret._setBoundTo(maybePromise);
34    if (maybePromise instanceof Promise) {
35        var context = {
36            promiseRejectionQueued: false,
37            promise: ret,
38            target: target,
39            bindingPromise: maybePromise
40        };
41        target._then(INTERNAL, targetRejected, undefined, ret, context);
42        maybePromise._then(
43            bindingResolved, bindingRejected, undefined, ret, context);
44        ret._setOnCancel(maybePromise);
45    } else {
46        ret._resolveCallback(target);
47    }
48    return ret;
49};
50
51Promise.prototype._setBoundTo = function (obj) {
52    if (obj !== undefined) {
53        this._bitField = this._bitField | 2097152;
54        this._boundTo = obj;
55    } else {
56        this._bitField = this._bitField & (~2097152);
57    }
58};
59
60Promise.prototype._isBound = function () {
61    return (this._bitField & 2097152) === 2097152;
62};
63
64Promise.bind = function (thisArg, value) {
65    return Promise.resolve(value).bind(thisArg);
66};
67};
68