好多小伙伴不理解Promise这个到底是干嘛的,怎么用?本篇就讲介绍下Promise内置类的使用以及作用。
一、先来说说Promise是什么
1.Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。
2.从语法上说,promise 是一个对象,从它可以获取异步操作的的最终状态(成功或失败)。
3.Promise是一个构造函数,对外提供统一的 API,自己身上有all、reject、resolve等方法,原型上有then、catch等方法
二、那么promise有什么作用
解决地狱回调
可以链式调用
应用场景:封装ajax,axios的get,post封装,微信小程序中封装wx.request(),uniapp开发中uni.request()
以上就是简单的对promise简单的介绍,promise的最主要的功能就是可以链式调用,这样就解决了回调地狱的出现,可以通过.then这个方法拿到参数大大的增加了代码的可读性
三、使用new来创建一个promise对象
Promise接受一个函数作为参数,该函数的两个参数分别是resolve和reject。这两个函数就是回调函数
resolve函数的作用:在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;
reject函数的作用:在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
const promise = new Promise((resolve, reject) => {
if (success) {
resolve(value); // fulfilled
} else {
reject(error); // rejected
}
});
四、Promise的API
1.then()方法就是把原来的回调写法分离出来,在异步操作执行完后,用链式调用的方式执行回调函数。而 Promise 的优势就在于这个链式调用。我们可以在 then 方法中继续写 Promise 对象并返回,然后继续调用 then 来进行回调操作。可有两个参数,第一个是成功 resolve 调用的方法,第二个是失败 reject 调用的方法
const promise = new Promise((resolve,reject)=>{
resolve('成功')
})
promise.then((res)=>{
console.log(res); //成功
},(err)=>{
console.log(err);//未执行
})
'
运行运行
上面样例我们通过 resolve 方法把 Promise 的状态置为完成态(Resolved),这时 then 方法就能捕捉到变化,并执行“成功”情况的回调。
而 reject 方法就是把 Promise 的状态置为已失败(Rejected),这时 then 方法执行“失败”情况的回调(then 方法的第二参数)
2.catch()方法和 then 的第二个参数一样,用来指定 reject 的回调,这里有一个点,就是如果then中有第二个参数,并且还有catch的时候会执行then的第二个参数。
它的另一个作用是,当执行 resolve 的回调(也就是上面 then 中的第一个参数)时,如果抛出异常了(代码出错了),那么也不会报错卡死 js,而是会进到这个 catch 方法中。
const promise = new Promise((resolve,reject)=>{
reject('失败')
})
// 使用catch方法进行捕捉错误
promise.catch(err=>{
console.log(err);//失败
})
//then的第二个参数的使用
promise.then((res)=>{
console.log(res); //未执行
},(err)=>{
console.log(err);//失败
}).catch(err=>{
console.log(err);
})
'
运行运行
3.all()方法
promise 的 all 方法提供了并行执行异步操作的能力,并且在所有异步操作执行完后才执行回调。all方法接受一个数组作为参数,参数是回调函数,只有所有的回调返回成功,才会执行成功的回调,如果有一个失败就会执行失败的回调
例子如下:
const promiseOne = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('成功1')
}, 1000);
})
const promiseTwo = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('成功2')
}, 2000);
})
const promiseThree = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('成功3')
}, 3000);
})
Promise.all([promiseOne,promiseTwo,promiseThree]).then(res=>{
console.log(res);//['成功1', '成功2', '成功3']
})
'
运行运行
4.race()方法race 按字面解释,就是赛跑的意思。race 的用法与 all 一样,只不过 all 是等所有异步操作都执行完毕后才执行 then 回调。而 race 的话只要有一个异步操作执行完毕,就立刻执行 then 回调,无论成功还是失败
注意:其它没有执行完毕的异步操作仍然会继续执行,而不是停止。
const promiseOne = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('成功1')
}, 1000);
})
const promiseTwo = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('成功2')
}, 2000);
})
const promiseThree = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('成功3')
}, 3000);
})
Promise.race([promiseOne,promiseTwo,promiseThree]).then(res=>{
console.log(res);//成功1
})
'
运行运行