基础理解
-
定义 定义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
是直接创建的所以该方法永远不会有拒绝状态
直接采用resolve方法接受一个参数直接返回一个完整的promise对象
-
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()
该方法相当于接受一个Promise数组转换成一个Promise对象,只有内部都处于完成状态合并的Promise对象才能完成
实际案例理解
获取用户登录信息和详细信息
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);
});