定义
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。