Promise学习

Promise

特点:

1、对象状态不受外界影响(pedding进行中、fulfilled已成功、rejected以失败)

2、一旦转跳发生给吧,就不会再变,任何时候都可以拿到这个结果。Promise对象状态改变只有两种

pending -> fulfilled 或 pending -> rejected 只要发生这两种改变,状态就会凝固,此时称之为resolved(已成型)

  • Promise新建后立刻执行指定的内容,等宏任务执行完后再将then存放到微任务的Event Queue中等待执行。等到主线程的空下来后在执行then(按照微任务的Event Queue顺序)

  • then方法是定义在原型对象 Promise.prototype上的,用于为Promise是添加改变涨停后的回调函数,返回的是Promise对象,所以支持后面再调用另一个then。假如第一个then里面返回的是另一个Promise对象,那么第二个then会等待返回另一个Promise对象的状态发生改变后再进行觉得调用哪个回调函数(resolved或rejected)

  • Promise.prototype.catch():

    • Promise.prototype.catch()是特殊的.then(null, rejection).then(undefined, rejection)的别名。增添catch()方法便于区分Promise状态转变到底是成功还是失败,而且将error信息从then的第二个回调函数参数中换到 .catch(error)中,能使代码更加简洁明了。
    • 假如Promise对象没有添加catch方法,那么假如Promise内部发生错误是不会给外部捕获到的,同时也不影响外部then()的执行
    • catch后面也可以继续调用then和catch,假如catch的操作中存在可能会发生的错误可以在后面再调用多一个catch方法来捕获第一个catch可能出现的错误!
  • Promise.prototype.finallly():

    • finally()方法用于指定不管 Promise 对象最后状态如何,都会执行的操作。不依赖于 Promise 的执行结果。
    • finnally()方法等同于 一段执行代码 在then() 和 catch() 中都写入了,使用finally()方法就可以提取出then和catch方法中一些相同的操作减少代码的重复。
  • Promise.all()

    • Promise.all()方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。方法的参数可以不是数组,但必须具有 Iterator 接口,且返回的每个成员都是 Promise 实例。

      const p = Promise.all([p1, p2, p3]);
      
    • p实例的状态:得等全部Promose成员都进入resolved(已定型)

    • 只有所有Promise成员都是fulfilled,p的状态才会转为fulfilled,并且将所有Promise的返回值以数组形式返回

    • 存在一个Promise成员是rejected状态,那么p的状态会转为rejected,p的返回的值是第一个被rejected的实例的值。不是全部!!!!

    • Promise.all()catch方法触发:

      • 如果某个Promise成员自己带有catch方法,那么当他内部报错后不会调用Promise.all()的chatch方法
      • 只有某个Promise成员没有自己的catch方法,就回去调用Promise.all()的方法
  • Promise.any()

    • Promise.any()方法接受一组 Promise 实例作为参数,包装成一个新的 Promise 实例。
    • 只要参数实例有一个变成fulfilled状态,包装实例就会变成fulfilled状态;如果所有参数实例都变成rejected状态,包装实例就会变成rejected`状态。与all()包装方法相反?
  • Promise.race():

    const p = Promise.race([p1, p2, p3]);
    
    • 方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例。
    • 只要p1p2p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数。所有这个race方法使用了看谁速度快执行谁?只要有一个执行完毕就停止?
    • 如果指定时间内没有获得结果,就将 Promise 的状态变为reject,否则变为resolve。相比于直接在Promise内部设置setTimeout返回错误(直接报错,而且无法catch),这里至少会以reject状态结束同时触发reject的回调函数!!
const p = Promise.race([
  fetch('/resource-that-may-take-a-while'),
  new Promise(function (resolve, reject) {
    setTimeout(() => reject(new Error('request timeout')), 5000)
  })
]);


//Error: fail
const p1 = new Promise(function (resolve, reject) {
  setTimeout(() => reject(new Error('fail')), 3000)
})
  • Promise.allSettled()

    • Promise.allSettled()方法接受一组 Promise 实例作为参数,包装成一个新的 Promise 实例
    • 只有等到所有这些参数实例都返回结果,不管是fulfilled还是rejected,包装实例才会结束。跟race()包装正好相反?
  • Promise.resolve():

    • 有时需要将现有对象转为 Promise 对象,Promise.resolve()方法就起到这个作用

      const jsPromise = Promise.resolve($.ajax('/whatever.json'));
      
    • Promise.resolve():的参数类型

      • Promise 实例:不做改变
      • thenable对象(带有then方法的对象):将该对象转为Proimse对象,然后立刻执行它自带的then方法
      • 参数不是具有then方法的对象,或根本就不是对象:返回一个新的 Promise 对象,状态为resolved
      • 不带有任何参数:直接返回一个resolved状态的 Promise 对象。
  • Promise.reject(reason)方法也会返回一个新的 Promise 实例,该实例的状态为rejected

Promise的应用
  • 加载图片
  • Generator 函数与 Promise 的结合
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值