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>

 
原文地址:https://www.cnblogs.com/Renyi-Fan/p/12702760.html