Promise
1、Promise有什么用?
Promise是ES6中的一个对象,用来解决异步编程问题的一种方案,在网上经常看到回调地狱问题,Promise把这种嵌套调用的形式改为链式调用的方式,使得代码维护起来容易。
回调地狱的例子
ajax({
url: 'http://localhost:3000/news',
data: {
name: '张三'
},
success(res) => {
ajax({
url: 'http://localhost:3000/news',
data: {
id: 'res.id'
},
success(res) => {
ajax({
....
})
}
}
})
用Promise可改为
let p1 = new Promise((resolve, reject) => {
return ajax({
url: 'http://localhost:3000/news',
data: {
name: '张三'
},
success(res) {
resolve(res)
},
error(err) {
reject(err)
}
}).then(res => {
return ajax({
url: 'http://localhost:3000/news',
data: {
id: 'res.id'
},
success(res) => {
resolve(res.comment)
},
error(err) {
reject(err)
}
}).then((res => {
....
}).catch({
console.log(err)
})
改为Promise后,代码从层层嵌套变为链式,通过then方法进行连接。
2、Promise的常用方法
在上面的代码里,ajax的成功回调函数是success,失败回调函数时error;Promise也有成功的回调函数和失败时的回调函数。
查阅资料得知,Promise有三种状态:pending(执行中的状态),fulfiled
(成功状态),rejected(失败状态) pending 状态的 Promise 对象可能会变为fulfilled 状态并传递一个值给相应的状态处理方法,也可能变为失败状态(rejected)并传递失败信息。
很容易理解这三个状态,执行中的状态就是初始状态,由初始状态转变为成功或者失败,所以状态的改变就只有两条线
Promise.resolve(value)方法返回一个已给定值解析后的Promise 对象。
列子中用到的resolve方法,如果数据请求成功,它会把当前的Promise的状态该为fulfiled,方法中value会封装进Promise里
Promise.reject(err)方法返回一个带有拒绝原因的Promise对象。
如果操作执行失败,它会把当前的Promise的状态该为rejected,并把err错误信息封装进Promise里
Promise.then()和Promise.catch()
当Promise的其中任一种状态出现时,Promise 对象的 then 方法绑定的处理方法(handlers )就会被调用(then方法包含两个参数:onfulfilled 和 onrejected,它们都是 Function 类型。当Promise状态为fulfilled时,调用 then 的 onfulfilled 方法,当Promise状态为rejected时,调用 then 的 onrejected 方法
catch方法其实和then方法的第二个参数一样,失败时调用
例子中如果第一个数据请求成功,它会通过then方法再次发起数据请求,
多个Promise链式操作的错误捕获可以通过一个catch处理,在例子最后用一个catch方法来捕获