基础理解
-
定义
定义promise函数会返回表示异步操作的promise对象,类似于承诺未来某个时刻完成。let promise = readFile("text.txt"); promise.then((content)=> { console.log(content); }), function(err) { console.log(err); }
-
三种状态
-
pending(进行中)
如上定义时对象就是该状态 -
Fulfilled、Rejected
当对象完成异步操作时结果的两种状态成功和失败
当我们操作挂起函数时,通过then方法去实现如上代码2~6
-
-
执行器操作
-
如果错误那么会向reject函数传递错误对象
-
当操作成功时执行器向resolve传递文件内容,读取文件然后在去执行then中的操作。
-
执行器是立即执行的,而then,catch方法会被丢入任务队列
-
-
创建已处理
- resolve
是直接创建的所以该方法永远不会有拒绝状态
直接采用resolve方法接受一个参数直接返回一个完整的promise对象let promise = Promise.resolve(12); promise.then(function(content){ console.log(content); // 12 })
- reject
与上面相反是创建一个仅拒绝状态下所用的let promise = Promise.reject(12); promise.catch(function(vaule) { console.log(vaule); })
- resolve
-
Promise串联
- then、catch方法运行时创建并返回了一个promise对象所以事件可以直接串联起来
let promise = Promise.resolve(42); promise.then((vaule) => { console.log(vaule); }).then(() => { console.log('串联实现'); });
- Promise链
可以给串联起来的下游Promise对象传递数值供操作
- then、catch方法运行时创建并返回了一个promise对象所以事件可以直接串联起来
-
响应多个Promise
- Promise.all()
该方法相当于接受一个Promise数组转换成一个Promise对象,只有内部都处于完成状态合并的Promise对象才能完成let p1 = new Promise(function(resolve, reject) { resolve(1); }); let p2 = new Promise(function(resolve, reject) { resolve(2); }); let p3 = new Promise(function(resolve, reject) { resolve(3); }); let p4 = Promise.all([p1, p2, p3]); p4.then(function(vaule) { console.log(vaule); })
- .race()
合并对象遵循最先的实现的
- Promise.all()
-
实际案例理解
获取用户登录信息和详细信息let status = 1; let userLogin = (resolve, reject)=> { setTimeout(()=> { if(status == 1) { resolve({name:'司尘', emailAddress:'111@163.com'}); }else { reject('登录失败'); } }, 2000); }; let getUserInfo = (resolve, reject)=> { setTimeout(()=> { if(status == 1) { resolve({birthplace:'Hubei', profession:'student'}); }else { reject('获取用户信息失败'); } }, 2000); }; let promise = new Promise(userLogin); promise.then((resolve, reject)=> { console.log(resolve); return new Promise(getUserInfo); }).then((resolve, reject)=> { console.log(resolve); });