Promise学习

1、Promise是个构造函数,使用new Promise()得到实例对象,接收一个函数作为参数,如:

let p = new Promise((resolve, reject) => {
})

2、Promise有三种状态:pending(进行中)、resolved(成功)、rejected(失败),状态只会从pending => resolved 或者 pending => rejected,当状态发生改变就会执行对应的回调函数resolve或reject(两者只会执行一个)

let p = new Promise((resolve, reject) => {
	resolve(111)
	reject(222)
})
console.log(p)
// 或
let p1 = new Promise((resolve, reject) => {
	reject(2222)
	resolve(1111)
})
console.log(p1)

在这里插入图片描述
输出结果可以看到只会显示一种状态的值

3.1、Promise.prototype.then()方法。接收两个参数(回调函数),分别用于执行成功或失败的回调函数,回调函数接收的值是resolve或reject传过来的值

let p = new Promise((resolve, reject) => {
	//resolve(1111)
	reject(2222)
})
p.then(value => {
	console.log(value) // 1111
}, reason => {
	console.log(reason)
})

3.2、如果then()返回的还是Promise对象,可以进行链式调用,同时then()可以只接收一个参数(成功时的回调函数)

let p = new Promise((resolve, reject) => {
	// 返回Promise对象
	let result = new Promise((resolve, reject) => {
		resolve(1)
	})
	resolve(result)
})
p.then(value => {
  let val = value + '-----'
	return new Promise((resolve, reject) => {
		resolve(val)
	})
}).then(value => {
	console.log(value)
})
//结果: 1-----

4、Promise.prototype.catch()方法。用于捕获失败的方法

let p = new Promise((resolve, reject) => {
	setTimeout(() => {
		reject(1)
	}, 1000)
})
p.then(value => {
	console.log(value + '-1')
	return new Promise((resolve, reject) => {
		resolve(2)
	})
}).then(value => {
	console.log(value + '-2')
}).catch(error => {
	console.log(error + '-3') 
})
// 1s后输出:1-3

5、Promise.resolve()是构造函数的方法,类似于new Promise(resolve => resolve()),返回状态为成功的Promise对象

let p = Promise.resolve(1)
console.log(p)

6、Promise.reject(),返回状态为失败的的Promise对象

Promise.reject('error').catch(e => {
	console.log(e)
})
// 输出: error

7、Promise.all(),接收一个数组,数组里面为Promise实例对象,当所有的实例对象状态都为fulfilled时Promise.all()才返回fulfilled,如果有一个为rejected,则Promise.all()返回rejected

let p1 = new Promise((resolve, reject) => {
	resolve(1)
})
let p2 = Promise.resolve(2)
let p3 = Promise.all([p1, p2])
console.log(p3)
let p4 = Promise.reject('error')
let p5 = Promise.all([p1, p2, p3, p4])
console.log(p5)

在这里插入图片描述
8、Promise.race(),同样接收一个数组为参数,数组里面为Promise实例对象,当实例对象中有一个的状态发生改变时就返回

let p1 = new Promise((resolve, reject) => {
	setTimeout(() => {
		resolve(1)
	}, 1000)
})
let p2 = Promise.resolve(2)
let p3 = Promise.reject('error')
let p4 = Promise.race([p1, p2, p3])
let p5 = Promise.race([p1, p3, p2])
console.log(p4)
console.log(p5)

在这里插入图片描述
看得到p4和p5中的p2和p3的顺序不一样,返回值也不一样,谁的状态先发生改变就返回谁

9、Promise代码的实现

class Promise {
 //构造方法
 constructor(executor) {
   //添加属性
   this.PromiseState = 'pending';
   this.PromiseResult = null;
   //声明属性
   this.callbacks = [];
   //保存实例对象的 this 的值
   //resolve 函数
   let resolve = (data) => {
     //判断状态
     if (this.PromiseState !== 'pending') return;
     //1. 修改对象的状态 (promiseState)
     this.PromiseState = 'fulfilled'; // resolved
     //2. 设置对象结果值 (promiseResult)
     this.PromiseResult = data;
     //调用成功的回调函数
     setTimeout(() => {
       this.callbacks.forEach(item => {
         item.onResolved(data);
       });
     });
   }
   //reject 函数
   let reject = (data) => {
     //判断状态
     if (this.PromiseState !== 'pending') return;
     //1. 修改对象的状态 (promiseState)
     this.PromiseState = 'rejected'; // 
     //2. 设置对象结果值 (promiseResult)
     this.PromiseResult = data;
     //执行失败的回调
     setTimeout(() => {
       this.callbacks.forEach(item => {
         item.onRejected(data);
       });
     });
   }
   try {
     //同步调用『执行器函数』
     executor(resolve, reject);
   } catch (e) {
     //修改 promise 对象状态为『失败』
     reject(e);
   }
 }

 //then 方法封装
 then(onResolved, onRejected) {
   //判断回调函数参数
   if (typeof onRejected !== 'function') {
     onRejected = reason => {
       throw reason;
     }
   }
   if (typeof onResolved !== 'function') {
     onResolved = value => value;
     //value => { return value};
   }
   return new Promise((resolve, reject) => {
     //封装函数
     let callback = (type) => {
       try {
         //获取回调函数的执行结果
         let result = type(this.PromiseResult);
         //判断
         if (result instanceof Promise) {
           //如果是 Promise 类型的对象
           result.then(v => {
             resolve(v);
           }, r => {
             reject(r);
           })
         } else {
           //结果的对象状态为『成功』
           resolve(result);
         }
       } catch (e) {
         reject(e);
       }
     }
     //调用回调函数  PromiseState
     if (this.PromiseState === 'fulfilled') {
       setTimeout(() => {
         callback(onResolved);
       });
     }
     if (this.PromiseState === 'rejected') {
       setTimeout(() => {
         callback(onRejected);
       });
     }
     //判断 pending 状态
     if (this.PromiseState === 'pending') {
       //保存回调函数
       this.callbacks.push({
         onResolved: function () {
           callback(onResolved);
         },
         onRejected: function () {
           callback(onRejected);
         }
       });
     }
   })
 }

 //catch 方法
 catch (onRejected) {
   return this.then(undefined, onRejected);
 }

 //添加 resolve 方法
 static resolve(value) {
   //返回promise对象
   return new Promise((resolve, reject) => {
     if (value instanceof Promise) {
       value.then(v => {
         resolve(v);
       }, r => {
         reject(r);
       })
     } else {
       //状态设置为成功
       resolve(value);
     }
   });
 }

 //添加 reject 方法
 static reject(reason) {
   return new Promise((resolve, reject) => {
     reject(reason);
   });
 }

 //添加 all 方法
 static all(promises) {
   //返回结果为promise对象
   return new Promise((resolve, reject) => {
     //声明变量
     let count = 0;
     let arr = [];
     //遍历
     for (let i = 0; i < promises.length; i++) {
       //
       promises[i].then(v => {
         //得知对象的状态是成功
         //每个promise对象 都成功
         count++;
         //将当前promise对象成功的结果 存入到数组中
         arr[i] = v;
         //判断
         if (count === promises.length) {
           //修改状态
           resolve(arr);
         }
       }, r => {
         reject(r);
       });
     }
   });
 }

 //添加 race 方法
 static race(promises) {
   return new Promise((resolve, reject) => {
     for (let i = 0; i < promises.length; i++) {
       promises[i].then(v => {
         //修改返回对象的状态为 『成功』
         resolve(v);
       }, r => {
         //修改返回对象的状态为 『失败』
         reject(r);
       })
     }
   });
 }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值