class Promise {
constructor(fn, params = { state: Promise.stateName.Pending }) {
function resolve(props_val) {
if (state == Promise.stateName.Pending) {
state = Promise.stateName.Resolved;
props = props_val;
resolve_handler_list.forEach(item => {
Promise.resolve(item.resolve_handler.call(null, props)).then(item.resolve);
// 执行内层容器观察者函数,如果该函数为执行外层容器的异步操作,则在异步操作完成后通知外层容器。
});
}
}
function reject(props_val) {
if (state == Promise.stateName.Pending) {
state = Promise.stateName.Rejected;
props = props_val;
}
}
this.then = function(resolve_handler, reject_handler) {
if (state == Promise.stateName.Pending) {
if (typeof resolve_handler == 'function') {
return new Promise(function(resolve, reject) {
resolve_handler_list.push({ resolve_handler, resolve });
});
}
// typeof reject_handler == 'function' && reject_handler_list.push(reject_handler);
} else if (state == Promise.stateName.Resolved) {
resolve_handler.call(null, props);
return Promise.resolve(props);
} else {
reject_handler.call(null, props);
}
};
var { state, props } = params;
const resolve_handler_list = [];
const reject_handler_list = [];
fn.call(null, resolve, reject);
}
}
Promise.stateName = {
Pending: Symbol('Pending'),
Resolved: Symbol('Resolved'),
Rejected: Symbol('Rejected'),
};
Promise.resolve = function(props) {
if (props instanceof Promise) return props;
return new Promise(() => {}, { state: Promise.stateName.Resolved, props });
};
Promise.reject = function(props) {
return new Promise(() => {}, { state: Promise.stateName.Rejected, props });
};
const getPrintSync = (function() {
var val = 0;
return () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
val = val + 1;
resolve(val);
}, 1000);
});
};
})();
getPrintSync()
.then(val => {
console.log(val);
return getPrintSync();
})
.then(val => {
console.log(val);
});
原生模仿实现Promise
猜你喜欢
转载自blog.csdn.net/weixin_39181833/article/details/81608735
今日推荐
周排行