【ECMAScript 5_6_7】9、ES6——Promise对象(异步回调问题解决方案一)

一、理解:

* Promise对象: 代表了未来某个将要发生的事件(通常是一个异步操作)
* 有了promise对象, 可以将异步操作以同步的流程表达出来, 避免了层层嵌套的回调函数(俗称'回调地狱')
* ES6的Promise是一个构造函数, 用来生成promise实例

二、使用promise基本步骤(2步):

  1、创建promise对象

let promise = new Promise((resolve,reject) => {
    // 初始化promise状态为padding
    // 执行异步操作
    if(异步操作成功){
        resolve(value)  // 修改promise的状态为fullfiled
    } else {
        reject(errMsg)  // 修改promise的状态为rejected
    }
})

  2、调用promise的then()

promise.then(
    result => console.log(result),  // 成功的回调
    errorMsg => alert(errorMsg)  // 失败的回调
)

三、promise对象的三个状态

* pending:初始化状态

* fullfiled:成功的状态

* rejected:失败的状态

四、应用

* 使用promise实现超时处理

* 使用promise封装处理ajax请求

let request = new XMLHttpRequest();
request.onreadystatechange = function () {
}
request.responseType = 'json';
request.open("GET", url);
request.send();

五、promise过程分析

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>11_Promise对象</title>
</head>
<body>
<script type="text/javascript">
  //创建一个promise实例对象
  let promise = new Promise((resolve,reject) => {
    //初始化promise的状态为pending--->初始化状态
    console.log('1111')  // 同步执行
    // 执行异步任务(通常是发送ajax请求,开启定时器)
    setTimeout(function () {
      console.log('3333')
      //下面根据异步任务的返回结果去修改promise的状态
      resolve('哈哈哈')  // 异步任务执行成功,修改promise为成功的状态fullfilled
      //reject('呜呜呜')  // 异步任务执行失败,修改promise为失败的状态rejected
    },1000)
  })
  console.log('2222')

  promise.then((data) => {  // 成功的回调,可以设置参数接收数据
    console.log(data + '执行成功了')
  },(error) => {  //失败的回调,可以设置参数接收数据
    console.log(error + '执行失败了')
  })

  //实现一个需求:先获取一篇新闻的主题内容(先展示给用户看),再根据隐藏id获取对应的评论内容(后展示给用户看)【这里需要先开启模拟路由:node www】
  function getNews(url) {
    let promise = new Promise((resolve,reject) => {
      //创建XMLHTTPRequest实例对象
      let request = new XMLHttpRequest()
      //监听状态
      request.onreadystatechange = function () {
        if(request.readyState == 4){
          //状态为200发送成功
          if(request.status == 200){
            let news = request.response
            resolve(news)
          }else{
            reject('暂时没有新闻内容')
          }
        }
      }
      //设置返回的数据类型
      request.responseType = 'json'  // 如果这里没有设置下面接收到的数据就需要用JSON.parse()转换
      //规定请求的方法,创建链接
      request.open('GET',url)
      //发送请求
      request.send()
    })
    return promise
  }

  getNews('http://localhost:3000/news?id=2')
    .then((data) => {
      console.log(data)
      let commentsUrl = data.commentsUrl
      let url = 'http://localhost:3000' + commentsUrl  // 拼串得到新的路由地址
      return getNews(url)  // 此处返回的相当于将上面返回的promise再往下面返回进入成功状态方法执行(.then可以链式调用)
    },(error) => {
      console.log(error)
    })
    .then((data) => {
      console.log(data)
    },(error) => {
      console.log(error)
    })

</script>
</body>
</html>

猜你喜欢

转载自blog.csdn.net/edc3001/article/details/87932920
今日推荐