Promise详解

介绍

一.表达
1. promise是ES的一门新技术
2. 是js中异步编程的新解决方案
二.具体
1. 从语法上来说:promise是一个构造函数
2. 从功能上来说:promise对象用来封装一个异步操作并可以获取成功/失败的结果值

异步编程

* fs 文件操作
* 数据库操作
* AJAX请求
* 定时

传统的解决异步编程都是通过回调函数解决的

promise 的状态

指的是实例对象中的一个属性【promiseState】
* pending 未决定的
* resolved / fullfilled c成功
* rejected 失败
状态改变只能改变一次,并且只能有pending—》成功或者失败

promise 的对象的值

指的是实例对象中的一个属性 【promiseResult】
保存着对象【成功/失败】的结果
* resolve
* reject

promise 构造函数

1.在promise内部的代码【执行器】会立即执行[不在等待队列中]
2.then中的函数在等待队列

promise.resolve() 【Promise.reject()相同但是’只能‘返回直白】

1.这个是promise函数对象的一个函数,不是实例对象的
2.使用:
var p1 = Promise.resolve(new Promise((resolve,reject)=>{
resolve(‘yes’)
}))
3.作用:返回一个promise对象,这个对象的状态就是传入promise的状态,值就是返回的值

  • 如果传递的不是一个promise对象,返回resolve,值为传入的值

promise.all() 【Promise.race(),相同但是,返回的是第一个成功的状态以及值】

1.传入一个数组,里面全是promis对象,返回一个"新的promise"
2.当里面所有的promise对象是成功才成功,返回的是一个成功值组成数组
3.有一个失败就为失败
4.使用:
p1 = Promise.resolve(“ok”)
p2 = Promise.resolve(“ok”)
const p2 = Promise.all([p1,p2])

promise关键问题

如何修改promise对象的状态

1.reslove()
2.reject()
3.抛出异常:throw

一个promise指定多个成功失败的回调函数,都会调用吗

都会调用

关于状态改变【resolve和reject】,和指定回调函数【then】的执行先后

1.都有可能先执行
2.先执行改变状态:
* 直接在执行器中调用resolve/reject
* 延迟更长时间调用then
3.什么时候得到数据
* 如果先执行then,当状态改变时才调用then里面的回调函数,得到数据
* 如果先执行状态,当执行到then的时候,直接调用里面的函数

关于then()的返回

1.then()返回的是一个新的promise对象
2.4种结果
*不写return,不返回任何东西:新的promise:状态成功,值:undefinde
*如果抛出异常, 新的promise:状态失败,值:异常的值
*如果返回非promise的值, 新的promise:状态成功,值:返回的值
*如果返回的是一个promise, 新promise:返回的promise
3.例子
var p1 = new Promise((resolve,rejecr)=>{
resolve()
})
var p2 = p1.then(()=>{
return ‘123’
})

promise的链式调用

1.由于then返回的是一个promise对象,那么就可以一直.then().then()

promise异常穿透

1.只在最后写一个cathch,不管那里失败了,都会在最后一个catch报出来
var p = new Promise((resolve,reject)=>{ resolve() })
p.then(res=>{
console.log(‘111’)
})
.then(res=>{
throw ‘失败’ //这里
})
.then(res=>{
console.log(‘222’)
})
.catch(
err=>{
console.log(err)
})

中断promise链

1.有且只有一种放方法,返回一个pending状态的promise,这样then返回的也是一个pending状态的promise,不会执行下一个then
2.不能throw,reject,因为实质上还是执行了的,只是穿透到了最后的catch,并没有中断
var p = new Promise((resolve,reject)=>{ resolve() })
p.then(res=>{
console.log(‘111’)
})
.then(res=>{
return new Promise(()=>{}) //这里
})
.then(res=>{
console.log(‘222’)
})
.catch(
err=>{
console.log(err)
})

自定义Promise

async和await

async

1.async处理的函数返回的是一个promise对象【和then相似】
2.promise的状态与值:
* 如果返回一个非promise数据。状态:成功,值:数组
* 如果返回一个promise对象 。与promise相同
* 如果抛出异常: 。状态:失败,值:异常结果
3.例子:
async function a(){
return ‘123’
}
var b = a()
cnosole.log(b)

await 表达式

  1. await右侧的表达式一般为promise对象,但是也可以是其他值
  2. 如果为promise对象,await返回的是promise成功的”值“
  3. 如果是其他值,是啥就返回啥【没啥用】
    • 注意,await必须写在async函数中【但是async可以没有await】
    • 如果await的promise为失败,就会抛出异常,需要通过try-catch捕获处理
      4.例子:
      async function c(){
      let p = new Promise((resolve,reject)=>{
      resolve(“成功了”)
      })
      let m = await p
      console.log(m)
      }
      c() //输出: ‘成功了’
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值