Promise理解

Promise是一个构造函数,里面有三种状态peading,fulfilled,reject也就是等待,成功,失败这三个状态。

1.等待状态

  const p1 = new Promise((resolve, reject) => {
    // 成功的时候 可以调用 resolve()方法 
    // 失败的时候 可以调用 reject()方法
  })
  console.log(p1)

可以看出在里面什么都没有干,此时就是一个等待的Promise状态。

2.成功的状态

const p1 = new Promise((resolve, reject) => {
    resolve('成功状态')
  }).then(res => alert(res))

view1:

view2:

解析在这个过程发生了什么事值得深究。

1.调用了resolve()这个方法,并且传递参数,被then方法捕获

2.同理调用reject()这个方法,会被catch捕获。

3.失败的状态

const p1 = new Promise((resolve, reject) => {
    reject('失败状态')
  })
  console.log(p1);

view

 捕获错误的方法是调用了原型链条上的catch方法。

  const p1 = new Promise((resolve, reject) => {
    reject('失败状态')
  }).catch(err => console.log(err))

4.应用在接口上

Promise是一种很好的异步编程的一种解决方案。

先看一下如果不用Promise会是一种什么状态呢?

比如我要发送三个请求

{请求1{请求2{请求3}}}

这就是所谓的:回调地狱。

多层函数嵌套,让人看的眼花,我们想要的是:

请求1

请求2

请求3

用promise解决问题

 let a1 = new Promise((resolve, reject) => {
    resolve('吃饭')
  }).then(res => {
    alert(res)
    return new Promise((resolve, reject) => {
      resolve('睡觉')
    })
  }).then(res => {
    alert(res)
    return new Promise((resolve, reject) => {
      resolve('打豆豆')
    })
  }).then(res => alert(res))

这种调用的方式是不是看起来更加清晰明了。

5.es7的async和await对代码进行改造

1.声明一点 用async修饰的函数是一个Promise对象。

代码:

   async function eat() {
    console.log('吃饭');
  }
  console.log(eat())

打印的结果:

 2.改造上面代码的结果

 // 1.吃饭
  async function eat() {
    return '吃饭'
  }

  // 2.睡觉
  async function shleep() {
    return '睡觉'
  }
  // 3.打豆豆
  async function dadoudou() {
    return '打豆豆'
  }
  async function fn() {
    const res = await eat()
    alert(res)
    const res1 = await shleep()
    alert(res1)
    const res2 = await dadoudou()
    alert(res2)
  }
  fn()

输出的结果和上面的任然是一致的,但是更加的简化。

6.Promise.race

这是Promise的一个api,赛跑机制。

代码:

 const a1 =
    new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve(20)
      }, 2000);
    })
  const a2 =
    new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve(100)
      }, 1000);
    })
  const a3 =
    new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve(30)
      }, 3000);
    })


  const p1 = Promise.race([a1, a2, a3]).then(res => alert(res))

谁用的时间最短就执行谁。

结果肯定执行100。

中途有reject也是一样的。

 const a1 =
    new Promise((resolve, reject) => {
      setTimeout(() => {
        reject(20)
      }, 2000);
    })
  const a2 =
    new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve(100)
      }, 1000);
    })
  const a3 =
    new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve(30)
      }, 3000);
    })


  const p1 = Promise.race([a1, a2, a3]).then(res => alert(res), err => alert(err))

7.Promise.all

相比于赛跑机制这个是一起去执行的。

  const a1 = Promise.resolve(10)
  const a2 = Promise.resolve(20)
  const a3 = Promise.reject(30)
  const p1 = Promise.all([a1, a2, a3]).then(res => console.log(res), err => console.log(err))

用[]包裹起来,  等里面的执行完毕在拿到相应的实例。

如果中途有错误会立马进行停止。

这个可以在发送多个异步请求的时候使用。发送前有个loading加载的效果。

等异步发送完毕后加载结束。

注意这个和异步的时间没有关系,和包裹的循序有关系。

  const a1 = Promise.resolve(10)
  const a2 = Promise.resolve(20)
  const a3 = Promise.resolve(30)
  const p1 = Promise.all([a2, a1, a3]).then(res => console.log(res), err => console.log(err))

输出[20,10,30]。

8.中断一个Promise

代码:

 new Promise((resolve, reject) => {
    resolve(2)
  }).then(res => {
    // 中断
    throw new Promise((resolve, reject) => {

    })
    return new Promise((resolve, reject) => {
      resolve(3)
    })
  }).then(res => console.log(res))

抛出一个等待的Promise状态即可。

9.Promise为什么能链式调用

解析:then 返回的一定是一个新的Promise实例

 const a1 = new Promise((resolve, reject) => {
    resolve(2)
  })
  const a2 = a1.then(res => console.log(res))
  console.log(a2);

可以看出返回的任然是一个Promise对象,只不过状态是peading状态。

  const a1 = new Promise((resolve, reject) => {
    resolve(2)
  }).then(res => {
    console.log(res);
    return Promise.resolve(200)
  }).then(res => console.log(res))

将里面的Promise状态改成成功,还是可以进行链式调用。这就是Promise链式调用的原理。

10.关于Primise状态的判断

快速创建一个Promise成功对象。

代码:

 const a1 = Promise.resolve(100)
  console.log(a1);

 快速创建一个Promise失败对象。

代码:

 const a1 = Promise.reject(100)
  console.log(a1);

view:

 

当返回一个普通的值的时候。

  async function fn() {
    return 123
  }
  const a1 = fn()
  console.log(a1);

view视图

 

用async修饰的函数是一个promise对象 返回一个值就是成功的状态。

关于Promise就说这么多了,持续更新中,点个赞呗。

        

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值