zoukankan      html  css  js  c++  java
  • 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对应的职业应该是老师,下面渲染的结果正确

    三、总结                                                                                         

     

    虽然现在走得很慢,但不会一直这么慢
  • 相关阅读:
    ubuntu 修改mysql 5.7数据库密码
    maven 配置
    数据仓库的命名规范
    mysql 之 在查询字段中得出分钟数
    mysql 之 timestampdiff() 函数 ,得到间隔分钟数
    linux 服务器上下载文件到本地
    mysql 之 时间格式 今年的第一天,去年的第一天
    mysql 之 str_to_date ()函数 和date_format()函数
    网络不可用时~更改DNS并刷新
    mysql之 round()函数 , concat()函数
  • 原文地址:https://www.cnblogs.com/xxm980617/p/10568330.html
Copyright © 2011-2022 走看看