没有看到这么直接的Promise实现

        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;
        })();

我在知乎的原文

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,355评论 25 709
  • 前几天 Vans Japan释出了2016 秋冬新作,鞋身图案采用时尚界大热的横须贺刺绣,不禁让小编想起了奶奶的绣...
    奕赏阅读 3,233评论 0 0
  • 作者:小歇叫瘦 昨天,为了把原来在美发店充的卡消耗一下,带上自己的护理产品去加工了。美发师拿了个喷枪似的玩意儿,在...
    我是言叫瘦阅读 3,255评论 0 1

友情链接更多精彩内容