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實現(xiàn)
最后編輯于 :
?著作權(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ù)。
【社區(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...