Promise
- 前言
- 一、Promise是什么?
- 二、为什么用Promise?
- 2.1解决回调地狱
- 2.2 集中错误处理
- 2.3代码解耦和复用
- 三、做什么?
- 四、原型方法和实例方法?
- 五、应用场景?
前言
promise是es6的新规范,它是一种异步解决方案,主要为了解决回调地狱问题。
一、Promise是什么?
Promise是异步编程的一种解决方案,可以将异步操作队列化,按照期望的顺序执行,返回符合预期的结果。
Promise对象有三个状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。
- 对象的状态不受外界影响,只有异步操作的结果,可以决定当前是哪一种状态
- 一旦状态改变(从pending变为fulfilled和从pending变为rejected),就不会再变,任何时候都可以得到这个结果
二、为什么用Promise?
Promise是异步方案,主要用来处理异步操作。
2.1解决回调地狱
我们写项目经常会遇到一个方法中如果成功了,会接着执行下一个逻辑,很多时候层层嵌套,导致后续维护要阅读很长很长的代码。而用Promise封装后,后续可以复用并且不影响其他逻辑。
例如我有一个上传图片,需要我不停在图片上添加东西的功能
upLoadImg(path,name,function(data) {
//加个地址
upLoadImg(path1,name,function(data) {
//加个时间
upLoadImg(path2,name,function(data) {
})
})
});
function fn(data){
//...
return data1;
}
function upLoadImg(path,name){
return new Promise((resolve, reject) => {
//...上传操作
//成功
let result = fn(data);
resolve(result)
//失败
reject()
}
}
upLoadImg('path','name') .then(data1 => {
return upLoadImg('path1', 'name1'); // 返回下一个Promise
}).then(data2 => {
return upLoadImg('path2', 'name2'); // 返回下一个Promise
}).catch(err => {
console.error( err);
});
2.2 集中错误处理
而Promise通过catch方法提供了集中的错误处理机制,无论异步操作在链式调用的哪个环节失败,都可以在catch方法中统一处理。
2.3代码解耦和复用
通过将异步操作封装在Promise对象中,我们可以将异步逻辑与业务逻辑解耦,使得代码更加模块化和可复用。
比如上述拍照功能,还有常见的封装get和post请求
例如小程序我会调用手机相机进行拍照或者选择相册进行上传操作
uni.chooseImage({
count: 6, //默认9
sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
sourceType: ['album'], //从相册选择
success: function (res) {
//...业务逻辑
}
});
这个业务逻辑有时候会让代码变得很长很长,试着改写一下
return new Promise((reslove, reject) => {
uni.chooseImage({
count: 6, //默认9
sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
sourceType: ['album'], //从相册选择
success: function (res) {
reslove(res);
},
fail: () => {
reject();
}
});
而我们用到的时候,直接 await 这个方法,进行接下来的逻辑。
三、做什么?
-
封装异步操作
-
链式调用:Promise的then方法返回一个新的Promise,可以链式地调用多个异步操作,并处理它们的结果。
-
错误处理:Promise提供了catch方法来处理异步操作中可能发生的错误。
-
状态管理:Promise对象具有三种状态:pending(等待中)、fulfilled(已成功)和rejected(已失败)。一旦Promise的状态从pending变为fulfilled或rejected,这个状态就不会再改变。
-
组合异步操作:Promise提供了Promise.all、Promise.race等静态方法来组合多个异步操作。
四、原型方法和实例方法?
五、应用场景?
异步操作场景
- 封装网络请求
- 定时操作
- 链式异步操作