Promise详解

一、Promise是什么?

1. Promise是ES6中一门新的技术,是JS中进行异步编程的新的解决方案。
2. Promise是一个构造函数,Promise对象可以用来封装一个异步操作并可以获取其成功与失败的返回值。

异步编程包括:

  1. fs 文件操作(对计算机磁盘进行读写操作)
  2. 数据库操作(mongDB,MySQL)
  3. AJAX网络请求
  4. 定时器

二、为什么要用Promise?

1. 指定回调函数的方式更加灵活:启动异步任务 => 返回Promise对象 => 给Promise对象绑定回调函数(甚至可以在异步任务结束后指定多个)。
2. 支持链式调用,可以解决回调地狱问题(即回调函数嵌套调用,外部回调函数异步执行的结果是嵌套的回调执行的条件)。
3. 增强代码的可读性与可维护性,代码更加优雅。

三、Promise使用实践

1.promise封装Ajax请求
    function sendAjax(url) {
      return new Promise((resolve,reject) => {
      const xhr = new XMLHttpRequest();   // 创建对象
      xhr.responseType = 'json';  // 对返回数据格式进行限制
      xhr.open('get', url);   // 调用open和send方法
      xhr.send();
      xhr.onreadystatechange = function() {   // 监听onreadystatechange事件
        if(xhr.readyState===4){
          if(xhr.status >= 200 && xhr.status <= 300){
            resolve(xhr.response)
          } else {
            reject(xhr.status)
         }
        }
      }
    });
  }
  sendAjax('https://www.baidu.com')
  .then(value => {
      console.log(value)
  }, err => {
      console.log(err)
  })
2.promise封装概率中奖事件
<body>
  <button id="btn">点击抽奖</button>
</body>
<script>
function rand(m,n) {     // 生成随机数函数
  return Math.ceil(Math.random()*(n-m+1)) + m-1
} 

var btn = document.querySelector('#btn')
btn.addEventListener('click', function () {
var p = new Promise((resolve,reject) => {
    setTimeout(() => {
      var num = rand(1, 100)
      if (num >= 1 && num <= 30) resolve(num)  // 将promise对象的状态设置为 【成功】
      reject(num)   // 将promise对象的状态设置为 【失败】
    }, 1000)
  }).then((value) => {   // 调用then方法
    alert('恭喜你中了666,您的数字为' + value)
  }, (result) => {
    alert('谢谢参与,您的数字为'+ result)
  })
})
</script>

四、Promise的状态

1.promise的状态:Promise实例对象中的一个属性 【PromiseState】
  1. pending 未决定的
  2. resolved / fullfilles 成功
  3. rejected 失败
2.Promise的状态改变
  1. pending变为resolved
  2. pending变为rejected
  • 说明:只有这两种,且一个Promise对象只能改变一次
         无论成功还是失败,都会有一个结果数据
         成功的结果数据一般称为value,失败的结果数据一般称为reason
    
3.Promise对象的值:Promise实例对象中的另一个属性 【PromiseResult】,保存着对象成功或失败的结果,且只有以下两个方法可以对PromiseResult的值进行修改
  • resolve()
  • reject()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小杜coding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值