zoukankan      html  css  js  c++  java
  • ES6课程---11、promise对象实例

    ES6课程---11、promise对象实例

    一、总结

    一句话总结:

    promise使用的时候将异步函数(比如ajax)放在Promise对应的构造函数中,并且通过resolve和reject回调函数设置promise状态并且传递异步操作数据,可以用promise的实例的then方法来接收resolve和reject回调函数传递过来的异步数据
    //定义一个请求news的方法
    function getNews(url){
      //获取新闻信息,并且设置状态
      let promise=new Promise(function (resolve, reject) {
          //启动异步任务
          let request = new XMLHttpRequest();
          request.onreadystatechange = function () {
              if(request.readyState === 4){
                  if(request.status === 200){
                      let news = request.response;
                      resolve(news);
                  }else{
                      reject('请求失败了。。。');
                  }
              }
          };
          request.responseType = 'json';//设置返回的数据类型
          request.open("GET", url);//规定请求的方法,创建链接
          request.send();//发送
      });
      return promise;
    }
    
    let btn = document.getElementById('btn');
    btn.onclick=()=>{
      getNews('http://api.com/api/news')
          .then((news) => {
              console.log(news);
              document.write(JSON.stringify(news));
          }, (error) => {
              alert(error);
          })
    };

    1、如果想在异步操作1后接着做异步操作2,用promise如何做?

    在异步操作1的then方法的回调函数中执行异步操作2,这样即可通过链式的调用then方法来达到以同步的方式来书写异步操作
    <button id="btn">获取新闻</button>
    <div id="news"></div>
    
    <script>
        //将原生的ajax函数用promise对象封装一下
        function ajax_fun(url){
            //获取ajax数据,并且设置promise状态
            let promise=new Promise(function (resolve, reject) {
                //启动异步任务
                let request = new XMLHttpRequest();
                request.onreadystatechange = function () {
                    if(request.readyState === 4){
                        if(request.status === 200){
                            //ajax请求数据成功
                            let data = request.response;
                            resolve(data);
                        }else{
                            //ajax请求数据失败
                            reject('请求失败了。。。');
                        }
                    }
                };
                request.responseType = 'json';//设置返回的数据类型
                request.open("GET", url);//规定请求的方法,创建链接
                request.send();//发送
            });
            return promise;
        }
    
        document.getElementById('btn').onclick=()=>{
            ajax_fun('http://api.com/api/news')
                .then((data)=>{
                console.log(data);
    
                let news=data['news'];
                console.log(news);
    
                let str='';
                news.forEach(function (value) {
                    //console.log(value);
                    str+=`<div style="font-weight: 600;font-size: 18px;margin-top: 30px;">${value['title']}</div>`;
                    str+=`<div>${value['content']}</div>`;
                });
    
                document.getElementById('news').innerHTML=str;
    
                //获取新闻的评论数据
                //获取第一条评论的id
                let first_id=news[0]['id'];
                console.log(first_id);
                return ajax_fun('http://api.com/api/news_comment/'+first_id);
    
            },(error)=>{
                alert(error);
            })
                .then(function (data) {
                    console.log(data);
    
                },function () {
    
                });
        };
        
    </script>

    二、promise对象实例

    博客对应课程的视频位置:11、promise对象实例
    https://www.fanrenyi.com/video/24/212

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>promise对象实例</title>
     6 </head>
     7 <body>
     8 <!--
     9 
    10 promise使用的时候将异步函数(比如ajax)放在Promise对应的构造函数中,
    11 并且通过resolve和reject回调函数设置promise状态并且传递异步操作数据,
    12 可以用promise的实例的then方法来接收resolve和reject回调函数传递过来的异步数据
    13 
    14 
    15 2、
    16 如果想在异步操作1后接着做异步操作2,用promise如何做
    17 在异步操作1的then方法的回调函数中执行异步操作2,
    18 这样即可通过链式的调用then方法来达到以同步的方式来书写异步操作
    19 
    20 
    21 //测试api
    22 获取新闻的url:http://api.com/api/news
    23 获取新闻评论的url:http://api.com/api/news_comment/1
    24 
    25 -->
    26 <button id="btn">获取新闻</button>
    27 <div id="news"></div>
    28 
    29 <script>
    30     //将原生的ajax函数用promise对象封装一下
    31     function ajax_fun(url){
    32         //获取ajax数据,并且设置promise状态
    33         let promise=new Promise(function (resolve, reject) {
    34             //启动异步任务
    35             let request = new XMLHttpRequest();
    36             request.onreadystatechange = function () {
    37                 if(request.readyState === 4){
    38                     if(request.status === 200){
    39                         //ajax请求数据成功
    40                         let data = request.response;
    41                         resolve(data);
    42                     }else{
    43                         //ajax请求数据失败
    44                         reject('请求失败了。。。');
    45                     }
    46                 }
    47             };
    48             request.responseType = 'json';//设置返回的数据类型
    49             request.open("GET", url);//规定请求的方法,创建链接
    50             request.send();//发送
    51         });
    52         return promise;
    53     }
    54 
    55     document.getElementById('btn').onclick=()=>{
    56         ajax_fun('http://api.com/api/news')
    57             .then((data)=>{
    58             console.log(data);
    59 
    60             let news=data['news'];
    61             console.log(news);
    62 
    63             let str='';
    64             news.forEach(function (value) {
    65                 //console.log(value);
    66                 str+=`<div style="font-weight: 600;font-size: 18px;margin-top: 30px;">${value['title']}</div>`;
    67                 str+=`<div>${value['content']}</div>`;
    68             });
    69 
    70             document.getElementById('news').innerHTML=str;
    71 
    72             //获取新闻的评论数据
    73             //获取第一条评论的id
    74             let first_id=news[0]['id'];
    75             console.log(first_id);
    76             return ajax_fun('http://api.com/api/news_comment/'+first_id);
    77 
    78         },(error)=>{
    79             alert(error);
    80         })
    81             .then(function (data) {
    82                 console.log(data);
    83 
    84             },function () {
    85 
    86             });
    87     };
    88 
    89 
    90 </script>
    91 </body>
    92 </html>

     
  • 相关阅读:
    我向老师问声好
    创业的27个真相:破釜沉舟时,要先学会潜水
    印象品牌:成功的标志
    稻盛和夫:打造两个世界500强的强者思维
    假如我们不曾相逢
    让我的诗句带走你的空虚
    昨日的誓言
    假如我有一百万
    我把我的青春献给你
    代腾飞(一读者为IT诗人代腾飞名字作诗)
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/12702760.html
Copyright © 2011-2022 走看看