ES6 Promise使用介绍
2024-09-05 14:56:19
1、什么是Promise
Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。
这么说可能不够直观的理解,看下面的两个例子
// callback回调函数
function getCallback(n,callback) {
setTimeout(() => {
var num = 2*n
console.log('num',num)
callback(num) },2000)
}
getCallback(3,function callback(n) {
console.log('n',n)
}) // Promise函数的基础用法(等同于上面的回调函数)
function runPro(n){
let p = new Promise((resolve,reject) => {
setTimeout(() => {
var num = 2*n
console.log('num',num)
resolve(num)
},2000)
})
return p
}
runPro(3).then((res) => {
console.log('res',res)
})
这么看是不是觉得Promise并没有什么特别的,而且还要费劲封装,有这功夫用回调函数就好了,那么在看下面的例子
// 三层callback回调函数(传说的回调地狱)
function getCallback0(n,callback1) {
setTimeout(() => {
var num0 = 2*n
console.log('num0',num0)
callback1(num0,function callback2(params,callback3) {
let num2 = params + 1
console.log('num2',num2)
callback3(num2)
})
},2000)
} getCallback0(3,function callback1(n,callback2) {
let num1 = n+1
console.log('num1',num1)
callback2(num1,function callback3(params) {
let num3 = params + 1
console.log('num3',num3)
}
)
}) // 三层Promise(等同于上面的回调函数)
function runPro0(n){
let p = new Promise((resolve,reject) => {
setTimeout(() => {
var num0 = n*2
console.log('num0',num0)
resolve(num0)
},2000)
})
return p
}
runPro0(3)
.then((res) => {
// console.log('res',res)
let Pro1 = new Promise((resolve,reject) =>{
var num1 = res+1
console.log('num1',num1)
resolve(num1)
})
return Pro1
})
.then((res) =>{
// console.log('res',res)
let Pro2 = new Promise((resolve,reject) =>{
var num2 = res+1
console.log('num2',num2)
resolve(num2)
})
return Pro2 })
.then((res) =>{
var num3 = res+1
console.log('num3',num3)
// 如果需要可以继续回调
})
通过上面的对比可以很清除的看出,用Promise处理异步事件更加简洁直观
2、基础用法
const p = new Promise(function(resolve,reject){
if(success){
resolve('成功的结果')
}else{
reject('失败的结果')
}
})
p.then(function (res) {
// 接收resolve传来的数据,做些什么 },function (err) {
// 接收reject传来的数据,做些什么
})
p.catch(function (err) {
// 接收reject传来的数据或者捕捉到then()中的运行报错时,做些什么
})
p.finally(function(){
// 不管什么状态都执行
})
3、Promise的相关方法
Promise.prototype.then()
Promise.prototype.catch()
Promise.prototype.finally()
Promise.resolve()
Promise.reject()
Promise.all()
Promise.race()
由代码可以看出.then() .catch() .finally()都是定义在原型对象上的
4、then 的用法
由上面的基础用法代码可以看出.then()接收两个参数,第一个是resolved状态的回调函数,第二个是rejected状态的回调函数
5、catch的用法
.catch方法是.then(null, rejection)的别名,用于指定发生错误时的回调函数。
6、finally的用法
.finally方法用于指定不管 Promise 对象最后状态如何,都会执行的操作。该方法是 ES2018 引入标准的。
7、all的用法
Promise的all方法提供了并行执行异步操作的能力,并且在所有异步操作执行完后才执行回调,all接收一个数组参数,里面的值最终都算返回Promise对象。这样,三个异步操作的并行执行的,等到它们都执行完后才会进到then里面。那么,三个异步操作返回的数据哪里去了呢?都在then里面呢,all会把所有异步操作的结果放进一个数组中传给then。
(1)只有getNumber1、getNumber2、getNumber3的状态都变成fulfilled,Promise的状态才会变成fulfilled,此时getNumber1、getNumber2、getNumber3的返回值组成一个数组,传递给Promise的回调函数。
(2)只要getNumber1、getNumber2、getNumber3之中有一个被rejected,Promise的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给Promise的回调函数。
function getNumber1(){
var p = new Promise(function(resolve, reject){
setTimeout(function(){
console.log('1')
resolve('随便什么数据1');
}, 1000);
});
return p;
}
function getNumber2(){
var p = new Promise(function(resolve, reject){
setTimeout(function(){
console.log('2')
reject('随便什么数据2');
}, 2000);
});
return p;
}
function getNumber3(){
var p = new Promise(function(resolve, reject){
setTimeout(function(){
console.log('3')
reject('随便什么数据3');
}, 3000);
});
return p;
}
Promise.all([getNumber1(),getNumber2(),getNumber3()])
.then(function(res){
console.log('res',res)
console.log('res',res[2].data)
},function (err){
console.log('err',err)
})
.catch(function(err2){
console.log('err2',err2) })
8、race的用法
Promise.race方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例。
不过只要getNumber1、getNumber2、getNumber3之中有一个实例率先改变状态,Promise的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给Promise的回调函数。
注意:
1、Promise定义后就执行,所以通常用函数进行分装
2、Promise.all()中的参数是以一个数组传入的
最新文章
- Android-小tips
- 3.1 哈尔空间 V0
- laravel(二):laravel基本入门 看到Hello Laravel
- Maven 实用命令和技巧
- select * 所有字段时如何巧妙的使用覆盖索引
- URAL-1981 Parallel and Perpendicular 水题
- [AngularJS] ngModelController render function
- Redis info 参数详解
- VBA中查找并选定文字
- DRF之项目搭建
- sed:-e 表达式 #1,字符 10:未终止的“s”命令
- 在浏览器中浏览git上项目目录结构
- 通过python脚本获取服务器硬件信息
- C#简单画图程序
- 修改mongodb(带仲裁节点的副本集)各机器端口
- 全网最详细的实用的搜索工具Listary和Everything对比的区别【堪称比Everything要好】(图文详解)
- [LeetCode] 661. Image Smoother_Easy
- 网页设置下载apk
- HDU 5908 Abelian Period 暴力
- 在JSP中如何使用JavaBean
热门文章
- 有关于eclipse启动调试时出现EOFexpetion错误的解决办法
- Minicom 简单使用
- Android layout_marginBottom无效
- 从入门到自闭之Python序列化
- javaScript基础知识总汇
- js文件的框架
- 小程序存emoji表情 不改变数据库
- hdu 6399 City Development
- hive报错java.sql.SQLException: null, message from server: ";Host '192.168.126.100' is not allowed to connect to this MySQL server";
- windows下xgboost安装到python