JavaScript之Promise

1.出现的意义:解决回调地狱(在回调函数中嵌套回调)
2.promise的基本使用:promise是一个构造函数,通过new关键字实例化对象

  • 语法: new promise((resolve,reject)=>{});promise接收一个函数作为参数,在参数函数中接收两个参数 :resolve,reject

3.promise实例有两个属性:state:状态 result:结果
4.promise的三种状态:

  • 第一种状态:pending(准备,待解决,进行中)
  • 第二种状态:fulfilled(已完成,成功)
  • 第三种状态:rejected(已拒绝,失败)

5.promise状态的改变:通过resolve()和reject()改变当前promise对象的状态

const p = new promise((resolve,reject)=>{
	resolve('参数');  //调用函数,使当前promise对象的状态改为fulfilled
	reject('参数');  //调用该函数,使当前promise对象的状态改为rejected
})
//promise状态的改变是一次性的,当调用了resolve()改变为fulfilled之后再调用其他就没用了

6.Promise的实例方法: .then(), .catch() .finish()

  • 1.当promise的状态是fullfilled时执行then方法;当状态时rejected时执行catch对错误进行处理
  • 2.then()方法第一个参数是resolved状态的回调函数,第二个参数是rejected状态的回调函数
    then方法返回的是一个新的Promise实例,也就是promise能链式书写的原因
const p = new Promise((resolve,reject)=>{
            resolve('成功调用了');
            //reject('失败调用了')
        })
     p.then((value)=>{
            console.log('成功了',value) //value参数就是resolve的参数,相当于形参对应实参
        },
        (err)=>{
            console.log('失败了',err)  //err就是rejected的参数 相当于形参对应实参
        })

//当promise的状态没有改变,是不会执行then方法的,即promise没有执行resolve()或者reject(),状态是pending状态,即以上代码是没有执行的
  • 3.catch方法在什么时候会被执行?
    ① 当执行rejected()时候
    ② 当promise出现错误代码时
    ③ 手动输出错误
    catch:正常返回时候状态也是fulfilled,报错的时候才是rejected,而不是执行了catch就是状态为rejected
  • 4.finally()方法用于指定不管 Promise 对象最后状态如何,都会执行的操作

7.Promise的prototype原型链方法(静态方法):resolve(),reject(),all(),race()

  • ①.resolve()方法:方法返回一个以给定值解析后的Promise 对象,实例状态为fullfilled
  • ②.reject()方法:Promise.reject(reason)方法也会返回一个新的 Promise 实例,该实例的状态为rejected
const p = Promise.reject('出错了')

等同于
const p = new Promise((resolve, reject) => reject('出错了'))
  • ③ all()方法:方法接收一个promise的iterable类型(注:Array,Map,Set都属于ES6的iterable类型)的输入,并且只返回一个Promise实例
const p = Promise.all([p1, p2, p3])
//实例p的状态由p1,p2,p3决定,分两种情况:
//只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数
//只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数

  • ④ reca()方法:该方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例
const p = Promise.race([p1, p2, p3])
//1.只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变
//2.率先改变的 Promise 实例的返回值则传递给p的回调函数
  • ⑤ any()方法:接收一个Promise可迭代对象,只要其中的一个 promise 成功,就返回那个已经成功的 promise 。如果可迭代对象中没有一个 promise 成功(即所有的 promises 都失败/拒绝),就返回一个失败的 promise 和AggregateError类型的实例,它是 Error 的一个子类,用于把单一的错误集合在一起。本质上,这个方法和Promise.all()是相反的。
const pErr = new Promise((resolve, reject) => {
  reject("总是失败");
});

const pSlow = new Promise((resolve, reject) => {
  setTimeout(resolve, 500, "最终完成");
});

const pFast = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, "很快完成");
});

Promise.any([pErr, pSlow, pFast]).then((value) => {
  console.log(value);
  // pFast fulfils first
})

8.promise解决回调地狱

 function getData(url,data={}){
            return new Promise((resolve,reject)=>{
                $.ajax({
                    method:'GET',
                    url:url,
                    data:data,
                    success:function(res){
                        //修改promise的状态为成功,修改promise的结果res
                        resolve(res)
                    },
                    error:function(res){
                        reject(res)
                    }
                })
            })
        }
        getData('data1.json').then((data)=>{
            const {name} = data;
            console.log(name)
            return getData('data2.json',name)
        }).then((data)=>{
            const {phone} = data;
            console.log(phone)
            return getData('data3.json',phone)
        }).then((data)=>{
            const {sex} = data
            console.log(sex)
        })

async、await与Promise

1.执行async函数,返回的都是promise对象

async function test1(){
return 1  //自动封装乘promise对象
}
async function test2(){
retuen Promise.resolve(1)
}
// 两个函数返回的都是promise对象,是一样的

2.Promise.then 成功的情况对应 await;await后面跟promise对象

async function test3(){
	const p3 = Promise.resolve(3)
	p3.then(data=>{
		console.log('data',data)
})

const data = await p3  // 与p3.then()是一样的,都是输出3
console.log('data',data)  
}

3.await 后面跟一个值

async function test4(){
	const data = await 4  //相当于执行了 await Promise.resolve(4) ;又因为await相当于Promise.then
console.log(data)   //4
}

4.await后面跟异步函数

async function test5(){
	const data = await test1()  
	console.log(data)  //输出1
}

5.promise.catch一场情况对应try…catch

async function test6(){
	const p6 = Promise.reject(6)
	try{
		const data6 = await p6
		console.log(data6)
	}catch(e){
		console.log('e',e)  //捕获到错误,输出6
		}
}

6.async(异步)函数执行的顺序问题

async function test1(){
	console.log('a')
	const result = await test2()  //await后面的代码,可以看成是放在异步里面的代码,相当于放在setTimeout里面
	console.log('result:',result)
	console.log('b')
} 
async function test2(){
	console.log('c')
}
console.log('d')
test1()
console.log(e)

//执行顺序为:d,a,c,e,result:underfined,b

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340