// 1.状态status变化,捕获异常
// 2.Promise异步操作(回调解决)
// 3.then链式操作,异步执行,捕获异常,空then
// 4.then返回值为new Promise
// 5.Promise.race(),Promise.all()
function Promise (executor) {
var self = this;
self.status = 'Pedding';
self.value = null;
self.ResolveCallBackList = [];
self.RejectCallBackList = [];
function resolve (value) {
if(self.status == 'Pedding'){
self.status = 'Fulfilled';
self.value = value;
self.ResolveCallBackList.forEach(function (ele) {
ele();
});
}
}
function reject (value) {
if(self.status == 'Pedding'){
self.status = 'Rejected';
self.value = value;
self.RejectCallBackList.forEach(function (ele) {
ele();
});
}
}
try{
executor(resolve, reject);
}catch(e){
reject(e);
}
}
Promise.prototype.then = function (onFulfilled, onRejected) {
var self = this;
onFulfilled = typeof(onFulfilled) == 'function' ? onFulfilled : function (value) {return value};
onRejected= typeof(onRejected) == 'function' ? onRejected: function (value) {return value};
return new Promise(function (res, rej) {
if(self.status == 'Fulfilled'){
setTimeout(function () {
try{
var nextResolveValue = onFulfilled(self.value);
if(nextResolveValue instanceof Promise){
nextResolveValue.then(res, rej);
}else{
res(nextResolveValue);
}
}catch(e){
rej(e);
}
}, 0);
}
// self.status == 'Rejected' 与上面一致
if(self.status == 'Pedding'){
self.ResolveCallBackList.push(function () {
setTimeout(function () {
try{
var nextResolveValue = onFulfilled(self.value);
if(nextResolveValue instanceof Promise){
nextResolveValue.then(res, rej);
}else{
res(nextResolveValue);
}
}catch(e){
rej(e);
}
}, 0);
});
// self.RejectCallBackList.push 与上面一致
}
})
}
Promise.all = function (promiseArr) {
return new Promise(function (res, rej) {
var arr = [];
function processData (i, data) {
arr[i] = data;
if(++i == promiseArr.length) res(arr);
}
for(var i = 0; i < promiseArr.length; i++){
promiseArr[i].then(function (value) {
processData(i, value);
}, reject);
}
});
}
Promise
最新推荐文章于 2024-08-02 14:21:03 发布