Promise是什么
promise 是 ES6 引入的异步编程的新解决方案。(解决回调地狱)让代码的可读性更高,更容易维护 。
所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。
从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。
Promise使用
- Promise构造函数接收一个函数作为参数,我们需要处理的异步任务就写在该函数体内,该函数的两个参数是resolve,reject。异步任务执行成功时调用resolve函数返回结果,反之调用reject。
- Promise对象的then方法用来接收处理成功时响应的数据,catch方法用来接收处理失败时相应的数据。
- Promise的链式编程可以保证代码的执行顺序,前提是每一次在than做完处理后,一定要return一个Promise对象,这样才能在下一次then时接收到数据。
Promise的特点
- 对象的状态不受外界影响(Promise对象代表一个异步操作,有三种状态)。 - pending(执行中) - Resolved(成功,又称Fulfilled) - rejected(拒绝) 其中pending为初始状态,fulfilled和rejected为结束状态(结束状态表示promise的生命周期已结束)。
- 一旦状态改变,就不会再变,任何时候都可以得到这个结果。 Promise对象的状态改变,只有两种可能(状态凝固了,就不会再变了,会一直保持这个结果):
- 从Pending变为Resolved
- 从Pending变为Rejected
- resolve 方法的参数是then中回调函数的参数,reject 方法中的参数是catch中的参数
- then 方法和 catch方法 只要不报错,返回的都是一个Resolved 状态的promise
- Promise最大的问题就是代码冗余,原来的异步任务被Promise封装一下,不管什么操作都用then
Promise的其他方法
Promise.resolve()
:返回的Promise对象状态为fulfilled,并且将该value传递给对应的then方法。Promise.reject()
:返回一个状态为失败的Promise对象,并将给定的失败信息传递给对应的处理方法。
// 实例化promise对象
const p = new Promise(function (resolve, reject) {
setTimeout(function () {
// 数据读取成功
// let data = '数据库中的用户数据';
// resolve(data);
// 数据读取失败
let err = '数据读取失败';
reject(err);
}, 1000)
});
// 调用promise对象的then方法
p.then(function (value) {
// 数据读取成功,调用then里面的第一个形参
console.log(value); // 数据库中的用户数据
}, function (reason) {
// 数据读取失败,调用then里面的第二个参数
console.log(reason); // 数据读取失败
})