沒有看到這么直接的Promise實現(xiàn)

        var Promise = (function () {
            var state = { pending: 0, resolved: 1, rejected: 2 };

            var Promise = function (asyncTask) {
                var asyncState = state.pending;
                var hasSolution = false;

                var asyncResult = [];
                var asyncError = [];
                var projectA = null;
                var projectB = null;
                var represent = { resolve: null, reject: null };

                var resolve = function () {
                    asyncState = state.resolved;
                    asyncResult = arguments;
                    if (hasSolution) {
                        if (typeof projectA === 'function') {
                            asyncPlan(projectA, arguments);
                        }
                        else {
                            represent.resolve.apply(undefined, arguments);
                        }
                    }
                };

                var reject = function () {
                    asyncState = state.rejected;
                    asyncError = arguments;
                    if (hasSolution) {
                        if (typeof projectB === 'function') {
                            asyncPlan(projectB, arguments);
                        }
                        else {
                            represent.reject.apply(undefined, arguments);
                        }
                    }
                };

                this.then = function (successPlan, failurePlan) {
                    hasSolution = true;
                    switch (asyncState) {
                        case state.pending:
                            projectA = successPlan;
                            projectB = failurePlan;
                            return new Promise(function (resolve, reject) {
                                represent.resolve = resolve;
                                represent.reject = reject;
                            });
                        case state.resolved:
                            if (typeof successPlan === 'function') {
                                return syncPlan(successPlan, asyncResult);
                            }
                            else {
                                return Promise.resolve.apply(undefined, asyncResult);
                            }
                        case state.rejected:
                            if (typeof failurePlan === 'function') {
                                return syncPlan(failurePlan, asyncError);
                            }
                            else {
                                return Promise.reject.apply(undefined, asyncError);
                            }
                    }
                };

                var syncPlan = function (plan, argus) {
                    var result = undefined;
                    try {
                        result = plan.apply(undefined, argus);
                    }
                    catch (error) {
                        return Promise.reject(error);
                    }

                    if (result instanceof Promise) {
                        return result;
                    }
                    else {
                        return Promise.resolve(result);
                    }
                };

                var asyncPlan = function (plan, argus) {
                    var result = undefined;
                    try {
                        result = plan.apply(undefined, argus);
                    }
                    catch (error) {
                        represent.reject.call(undefined, error);
                    }

                    if (result instanceof Promise) {
                        result.then(function () {
                            represent.resolve.apply(undefined, arguments);
                        }, function () {
                            represent.reject.apply(undefined, arguments);
                        });
                    }
                    else {
                        represent.resolve.call(undefined, result);
                    }
                };

                this.catch = function (failurePlan) {
                    return this.then(undefined, failurePlan);
                };

                try {
                    asyncTask(resolve, reject);
                }
                catch (error) {
                    reject(error);
                }
            };

            Promise.resolve = function () {
                var argus = arguments;
                return new Promise(function (resolve) {
                    resolve.apply(undefined, argus);
                });
            };

            Promise.reject = function () {
                var argus = arguments;
                return new Promise(function (none, reject) {
                    reject.apply(undefined, argus);
                });
            }

            return Promise;
        })();

我在知乎的原文

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,940評論 25 709
  • 前幾天 Vans Japan釋出了2016 秋冬新作,鞋身圖案采用時尚界大熱的橫須賀刺繡,不禁讓小編想起了奶奶的繡...
    奕賞閱讀 503評論 0 0
  • 作者:小歇叫瘦 昨天,為了把原來在美發(fā)店充的卡消耗一下,帶上自己的護(hù)理產(chǎn)品去加工了。美發(fā)師拿了個噴槍似的玩意兒,在...
    我是言叫瘦閱讀 498評論 0 1

友情鏈接更多精彩內(nèi)容