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;
})();
没有看到这么直接的Promise实现
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...