78 lines
1.7 KiB
JavaScript
78 lines
1.7 KiB
JavaScript
/**
|
|
* Promise adapter.
|
|
*/
|
|
|
|
import PromiseLib from './lib/promise';
|
|
|
|
if (typeof Promise === 'undefined') {
|
|
window.Promise = PromiseLib;
|
|
}
|
|
|
|
export default function PromiseObj(executor, context) {
|
|
|
|
if (executor instanceof Promise) {
|
|
this.promise = executor;
|
|
} else {
|
|
this.promise = new Promise(executor.bind(context));
|
|
}
|
|
|
|
this.context = context;
|
|
}
|
|
|
|
PromiseObj.all = function (iterable, context) {
|
|
return new PromiseObj(Promise.all(iterable), context);
|
|
};
|
|
|
|
PromiseObj.resolve = function (value, context) {
|
|
return new PromiseObj(Promise.resolve(value), context);
|
|
};
|
|
|
|
PromiseObj.reject = function (reason, context) {
|
|
return new PromiseObj(Promise.reject(reason), context);
|
|
};
|
|
|
|
PromiseObj.race = function (iterable, context) {
|
|
return new PromiseObj(Promise.race(iterable), context);
|
|
};
|
|
|
|
var p = PromiseObj.prototype;
|
|
|
|
p.bind = function (context) {
|
|
this.context = context;
|
|
return this;
|
|
};
|
|
|
|
p.then = function (fulfilled, rejected) {
|
|
|
|
if (fulfilled && fulfilled.bind && this.context) {
|
|
fulfilled = fulfilled.bind(this.context);
|
|
}
|
|
|
|
if (rejected && rejected.bind && this.context) {
|
|
rejected = rejected.bind(this.context);
|
|
}
|
|
|
|
return new PromiseObj(this.promise.then(fulfilled, rejected), this.context);
|
|
};
|
|
|
|
p.catch = function (rejected) {
|
|
|
|
if (rejected && rejected.bind && this.context) {
|
|
rejected = rejected.bind(this.context);
|
|
}
|
|
|
|
return new PromiseObj(this.promise.catch(rejected), this.context);
|
|
};
|
|
|
|
p.finally = function (callback) {
|
|
|
|
return this.then(function (value) {
|
|
callback.call(this);
|
|
return value;
|
|
}, function (reason) {
|
|
callback.call(this);
|
|
return Promise.reject(reason);
|
|
}
|
|
);
|
|
};
|