JSFiddle - React, Tailwind, and code Playground

by Castrolol

JavaScript

(function (w) {

    var Promise = function (func) {

        var result;
        var error;
        var undef;
        var promise = this;
        var isAsync = false;
        var funcs = [];
        var step = 0;
        var lastError = -2;

        function then(func) {
            try {
                if (isAsync) {
                    funcs.push({
                        isAsync: false,
                        exec: func,
                        type: "then"
                    });
                } else {
                    step++;
                    result = func(error, result);
                    error = undef;
                }
            } catch (e) {
                lastError = step;
                error = e;
                result = undef;
            }
            return promise;
        }

        function fail(func) {
            if (isAsync) {
                funcs.push({
                    isAsync: false,
                    exec: func,
                    type: "fail"
                });
            } else {
                if (lastError === step) {
                    step++;
                    func(error);
                }
            }
            return promise;
        }

        function done(func) {
            if (isAsync) {
                funcs.push({
                    isAsync: false,
                    exec: func,
                    type: "done"
                });
            } else {
                if (lastError !== step && lastError + 1 !== step) {
                    step++;
                    func(result);
                }
            }
            return promise;
        }

        function wait(asyncFunc) {

            if (isAsync) {
                funcs.push({
                    isAsync: true,
                    exec: asyncFunc
                });
            } else {
                step++;
                isAsync = true;
                asyncFunc(error, result, function (err, returnValue) {

             ...