ES6(promise)_解决回调嵌套简单应用

一、前言                                                                                                

 

这个小案例是在node平台上应用的所以需要保证你的电脑:

                                                                 1、安装和配置node.js环境

                                                                 2、需要用node.js来开启一个http-server: 开启方法:https://blog.csdn.net/kaixinhlz/article/details/67046964

                                                                 3、需要模拟数据接口   模拟方法:https://www.cnblogs.com/blackgan/p/7435228.html

 

二、主要内容                                                                                        

1、项目说明:

     (1)项目结构

      

 

     (2)代码如下

      data.json中有user 和jobs两张表  uesr表里面保存了job在jobs表中的对应id

      data.json如下:

{
    "users": [{
        "id":1,
        "username": "admin",
        "age": 18,
        "job": 2
    },
    {
        "id": 2,
        "username": "admin2",
        "age": 18,
        "job": 4
    }
    ,
    {
        "id": 3,
        "username": "admin3",
        "age": 18,
        "job": 2
    }
    ,
    {
        "id": 4,
        "username": "admin4",
        "age": 18,
        "job": 2
    }

],

    "jobs": [
        {
        "id": 1,
        "name": "学生"
    },

    {
        "id": 2,
        "name": "老师"
    },

    {
        "id": 3,
        "name": "司机"
    },

    {
        "id": 4,
        "name": "画家"
    },

    {
        "id": 5,
        "name": "演员"
    },

    {
        "id": 6,
        "name": "电竞人"
    }

    ]


}
data.json

 

      index.html(回调嵌套的方式同时获取两个数据接口的数据)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <form action="" id="user-form"> 
        
    </form>
    <script type="text/template" id="tpl">
        
        <div>
            <label for="">姓名</label>
            <input type="" name="" value="{{ user.username }}">
        </div>

        <div>
            <label for="">年龄</label>
            <input type="text" name="" value="{{ user.age }}">
        </div>

        <div>
            <label for="">职业</label>
            <select name="" id="">
                {{ each jobs }}

                {{ if user.job === $value.id }}
                  <option value="{{ $value.id }}" selected>{{ $value.name }}</option>
                {{else}}
                  <option value="{{ $value.id }}">{{ $value.name }}</option>
                {{/if}}

                {{/each}}
                <option>学生</option>
                <option>老师</option>
                <option>司机</option>
                <option>画家</option>
                <option>演员</option>
                <option>电竞人</option>
            </select>
        </div>
    
    </script>
    <script src="node_modules/art-template/lib/template-web.js"></script>
    <script>
        

        get('http://localhost:3000/users/1', function (usersdata) {
            get('http://localhost:3000/jobs', function (jobsdata) {

                console.log(usersdata, jobsdata)

                var htmlStr = template('tpl', {
                    user: JSON.parse(usersdata),
                    jobs: JSON.parse(jobsdata)
                })


                document.querySelector('#user-form').innerHTML = htmlStr

            })
        })










        function get(url, callback) {
            var oReq = new XMLHttpRequest()

            oReq.onload = function () {
                callback(oReq.responseText);
            }

            oReq.open("get", url, true)
            oReq.send()
        }

        get('data.json', function (data) {
            console.log(data)
        })
    </script>
</body>
</html>
index.html

     

      index.html(Jquery中的ajax就支持了promise)

2、具体实现

 

第一步:制作数据接口

(1)在 项目中安装json-server

//一:安装json-server
npm install -g json-serv

 

(2)先在文件中创建一个data.json文件,文件的内容如上所示,

(3)运行 data.json是你上面创建的文件

 

json-server --watch data.json

 

(4)运行成功会返回给我们如下地址,复制地址到浏览器中打开,会出现两条数据接口

 

如下:

 

第二步:将上面请求到的接口渲染到页面上

      (1)先安装http-server来帮助我们快速开启一个服务  ,重新再开一个cmd命令框,不要将上面开启的数据接口关闭了

//安装
npm install http-server

//开启
hs -o

      

       (2)访问这个地址

 

 

 第三步:   要将数据渲染到页面上 必须请求数据,处理响应,再进行页面渲染

 

方式一:用原生ajax方式请求

//这里在请求user表
get('http://localhost:3000/users/4', function (err, userdata){
              console.log(userdata)
                       //请求user表的同时也请求job表
            get(' http://localhost:3000/jobs', function (err, jobsdata) {
                              //模板
                var htmlStr = template('tpl', {
                    user: JSON.parse(userdata),
                    jobs: JSON.parse(jobsdata)
                })

                document.querySelector.innerHTML = htmlStr
            })
        })

        //原生ajax实现
        function get(url, callback){

            var oReq = new XMLHttpRequest();

            oReq.onload=function() {
                
                console.log(oReq.responseText)
            }

            oReq.open("get", url, true);
            oReq.send();
        }

 

   方式二:Jquery中的ajax就已经支持promise

    

 

 var data = {}
    $.get('http://localhost:3000/users/4')
      .then(function (user) { 

       data.user = JSON.parse(user)

       return $.get('http://localhost:3000/jobs')//// 当前函数中 return 的结果就可以在后面的 then 中 function 接收到,这里的请求结果就可以在下面接收,这里return 的是什么,接收到的就是什么

      })
      .then(function (jobs) {
          data.job = jobs  //接收结果

          var htmlStr = template('tpl', data)

          document.querySelector('#user-form').innerHTML = htmlStr

      })

 

     

  方式三:封装上面的get方法,让他也支持promise

     //接受请求到的数据
      var data = {}
       Pget('http://127.0.0.1:3000/users/4')
       .then( function(user) {
           data.user = JSON.parse(user)
           return pGet('http://127.0.0.1:3000/jobs')
       })
       .then(function (jobs) {
              data.user = JSON.parse(user)

              var htmlStr = template('tpl', data);
              document.querySelector('#user-form').innerHTML = htmlStr
       })

    //封装promise
        function Pget(url) {

            return new Promise(resolve, reject) {
                         var oReq = new XMLHttpRequest()
             //当请求成功时调用resolve函数
            oReq.onload = function () {
                resolve(oReq.responseText);
            }
            //请求失败时调用reject
            oReq.onerror = function(err){
                reject(err)
            }

            oReq.open("get", url, true)
            oReq.send()
            }
            
        }

        

 

 查看结果:我们请求的地址是:http://127.0.0.1:3000/users/4  也就是user表中的第四条,里面的job:=2   ,job=2对应的职业应该是老师,下面渲染的结果正确

 

 

 

三、总结                                                                                         

 

posted @ 2019-03-21 20:17  mysunshine_SZZ  阅读(659)  评论(0编辑  收藏  举报