Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const PENDING = 'pending';
- const FULFILLED = 'fulfilled';
- const REJECTED = 'rejected';
- class Waiter {
- constructor (callback) {
- this.accept = this.accept.bind(this);
- this.reject = this.reject.bind(this);
- this.state = PENDING;
- this.successCallbacks = [];
- this.failureCallbacks = [];
- this.isWaiter = true;
- this.value = null;
- if (callback) callback(this.accept, this.reject);
- }
- accept(value) {
- setTimeout(() => {
- this.state = FULFILLED;
- this.value = value;
- for (var i = 0; i < this.successCallbacks.length; i++)
- this.successCallbacks[i](value);
- this.successCallbacks = [];
- }, 0);
- }
- reject(value) {
- setTimeout(() => {
- this.state = REJECTED;
- this.value = value;
- if (this.failureCallbacks.length === 0)
- throw new Error("Unhandled waiter rejection: " + value);
- for (var i = 0; i < this.failureCallbacks.length; i++)
- this.failureCallbacks[i](value);
- this.failureCallbacks = [];
- });
- }
- then(successCallback, failureCallback) {
- var tmpAccept, tmpReject;
- var tmpWaiter = new Waiter((accept, reject) => {
- tmpAccept = accept;
- tmpReject = reject;
- });
- if (successCallback)
- this.successCallbacks.push(
- this.createRunner(successCallback, tmpAccept, tmpReject)
- );
- if (failureCallback)
- this.failureCallbacks.push(
- this.createRunner(failureCallback, tmpAccept, tmpReject)
- );
- if (this.state === FULFILLED) this.accept(this.value);
- if (this.state === REJECTED) this.reject(this.value);
- tmpWaiter.resolve = null;
- return tmpWaiter;
- }
- catch(failureCallback) {
- return this.then(null, failureCallback);
- }
- resolve() {
- this.accept();
- return this;
- }
- createRunner(callback, tmpAccept, tmpReject) {
- return (value) => {
- try {
- let result = callback(value);
- if (result && result.isWaiter) {
- result.then(tmpAccept, tmpReject);
- } else {
- tmpAccept(result);
- }
- } catch (error) {
- tmpReject(error);
- }
- };
- }
- }
- // Testing Code
- let testWaiter = new Waiter(function (accept, reject) {
- setTimeout(() => accept('hi'), 500);
- });
- testWaiter.then(function (value) {
- console.log(value + ' friend');
- return new Waiter(function (accept, reject) {
- setTimeout(() => reject('oh man'), 1000);
- });
- })
- .then(function (value) {
- console.log('todo bien');
- },
- function (error) {
- console.log('"' + error + '"');
- });
- testWaiter.then(function (value) {
- console.log(value);
- console.log('Robert');
- return new Waiter(function (accept, reject) {
- setTimeout(() => accept('how?'), 250);
- });
- })
- .then(function (value) {
- console.log(value);
- })
- .then(function (value) {
- console.log('what?');
- throw new Error('test');
- })
- .catch(function (value) {
- console.log('"' + value + '"');
- })
- .then(function (value) {
- console.log('After error: ' + value);
- });
Add Comment
Please, Sign In to add comment