Skip to content

Instantly share code, notes, and snippets.

@mayank-shekhar
Created July 19, 2023 06:24
Show Gist options
  • Save mayank-shekhar/020e5669be53e281e7e701312a9cc9a3 to your computer and use it in GitHub Desktop.
Save mayank-shekhar/020e5669be53e281e7e701312a9cc9a3 to your computer and use it in GitHub Desktop.
Simple polyfill for JavaScript Promise class
function CustomPromise (executor) {
let onResolve;
let onReject;
let isFulfilled = false;
let isRejected = false;
let isCalled = false; // indicates callback has been called
let value; let error;
function resolve(val) {
isFulfilled = true;
value = val;
if (typeof onResolve === 'function' && ! isCalled) {
onResolve (val);
isCalled = true;
}
}
function reject(err) {
isRejected = true;
error = err;
if (typeof onReject === 'function' && !isCalled) {
onReject(err);
isCalled = true;
}
}
this.then = function (thenHandler) {
onResolve = thenHandler;
if (isCalled && isFulfilled) {
onResolve(value);
isCalled = true;
}
return this;
};
this.catch = function (catchHandler) {
onReject = catchHandler;
if (!isCalled && isRejected) {
onReject(error);
isCalled = true;
}
return this;
}
executor( resolve, reject);
}
@mayank-shekhar
Copy link
Author

MyPromise.resolve = (val) => {
    return new MyPromise(function executor (resolve, reject) {
        resolve(val);
    })
}
MyPromise.reject = (reason) => {
    return new MyPromise(function executor(resolve, reject) {
    reject(reason);
    });
}
MyPromise.all = function (promises) {
    return new MyPromise( function executor (resolve, reject) {
        let cnt = 0;
        let res = [];
        if (promises. length === 0) {
            resolve(promises);
            return;
        }
        for (let i = 0; i < promises. length; i++) {
            promises[i].then((val) => {
                done (val, i);
            }).catch((err) => reject(err));
        }
        function done(val, i) {
            res[i] = val;
            ++cht;
            if (promises. length === cnt) {
                resolve(res);
            }
        }
    });
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment