笔记:Promise对象的ES5、ES6的简单原生实现

定义

Promise 是异步编程的一种解决方案,可以通过链式的方式获取异步操作的结果,解决了古老的回调函数嵌套问题。

Promise 状态

Promise 异步操作三种状态:
1.pending(进行中)
2.fulfilled(已成功)
3.rejected(已失败)

状态变化:
1.pending -> fulfilled
2.pending -> rejected 的状态改变。
状态只要处于 fulfilled 和 rejected ,状态就不会再变了即 resolved(已定型)。

ES5简单实现

function Promise(resolver){
	this.status = 'pending';
	this.result;
	this.resolve = function(){
		this.result = arguments[0];
		this.status = 'fulfilled'}
	this.reject = function(res){	
		this.result = arguments[0];
		this.status = 'rejected '
	}
	resolver(this.resolve.bind(this),this.reject.bind(this))this.then = function(callback){
		//定时器监听状态变化,如果有变化则执行callback
		const interval = setInterval(() => {
        if (this.status ==='fulfilled' || this.status ==='rejected') {
	            clearInterval(interval);        callback(this.result,this.resolve.bind(this),this.reject.bind(this))		
	            //重新将状态转换成pendding为下一个then执行
	            this.status = 'pending'
	        }
	    });
		return this;
	}
}
var myPromise = new Promise(function(resolve,reject){
	setTimeout(() => {
        resolve(2);
        console.log(1)
    }, 1000);
})then(function(res,resolve,reject){
	setTimeout(() => {
        resolve(3);
        console.log(res)
    }, 3000);
}).then(function (res, resolve, reject) {
    console.log(res);
})

ES6简单实现

class Promise {
    constructor(resolver) {
		this.status = 'pendding';
		this.result;
	    function resolve() {
	        this.result = arguments[0];
	        this.status = 'fulfilled';
	    }
	    function reject() {
	        this.result = arguments[0];
	        this.status = 'rejected';
	    }
        resolver(
            resolve.bind(this)//绑定promise实例对象
            reject.bind(this));
        this.then=(callback) =>{
	        const interval = setInterval(() => {
	            if (this.status === 'fulfilled' || this.status === 'rejected') {
	                clearInterval(interval);
	                callback(this.result, `在这里插入代码片`resolve.bind(this), reject.bind(this));
	                this.status = 'pendding';
	            }
	        });
        	return this;
    	}
    }
}
var myPromise = new Promise(function(resolve,reject){
	setTimeout(() => {
        resolve(2);
        console.log(1)
    }, 1000);
}).then(function(res,resolve,reject){
	setTimeout(() => {
        resolve(3);
        console.log(res)
    }, 3000);
}).then(function (res, resolve, reject) {
    console.log(res);
})

打印信息
在这里插入图片描述
疑点解释
为什么要用定时监听状态变化?
1.在实际场景中都是执行ajax异步去获取数据,所以在没有获得数据之前,状态一直是pending。
2.执行then方法的目的是做一个定时轮询去查状态是否改变,状态改变则开始执行。
3.等于是把后面要执行的步骤存到一个函数数组里,然后等待状态改变,再去执行数组里的每一个function。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值