Promise

// 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);
		}
	});
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值