zoukankan      html  css  js  c++  java
  • 封装Promise版本的ajax方法

    正如之前封装的ajax方法

      

    调用时可以使用callback形式进行接口伪嵌套,但容易形成callback hell回调地狱。

    Promise应用场景里,我们使用jQuery的$.get的promise语法格式(jQuery内置支持promise)实现了then链式调用,接下来将promise语法封装到之前的get方法里,封装后的调取方式如下

      

    即我们自定义的get方法也支持then链式调用,这里注意:

      

    只有promise对象才可以调用.then方法,所以get封装如下

      

       然后将ajax操作复制进来,总体代码如下

      

      接下来注意,此时callback已经不需要了,所以去掉;

      

       之后做下测试

      

      

    注意:此时需要开启json-server模拟服务器API.启动服务器,才可以进行测试

      下面还需要一些完善即可和之前Promise应用场景的jQuery支持的promise一样调用,如下所示,还需进行JSON解析

      

       至此结果如下,便可以进行正常使用

      

    至此边和之前jQuery的get的promise方式相同,但$.get同时支持回调形式调用,那么我们这里也可以加入回调,让其既支持promise,又支持callback

        

         此时也可以通过callback调用

        

    jQuery为了顾及程序员不同写法爱好,源码也是这么处理,对多种格式都支持

       完整代码如下:

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>Promise应用场景举例--信息分类展示</title>
    </head>
    <body>
        <form id="user_form">
            
        </form>
        <script type="text/javascript" src="node_modules/art-template/lib/template-web.js"></script>
        <script type="text/template" id="tpl">
            <div>
                姓名:
                <input type="text" name="username" value="{{user.username}}">
            </div>
            <div>
                年龄:
                <input type="number" name="userage" value="{{user.age}}">
            </div>
            <div for="job">
                职业
                <select>
                    {{each jobs}}
                        {{if $value.id === user.job}}
                            <option id="{{$value.id}}" selected>{{$value.name}}</option>
                            {{else}}
                            <option id="{{$value.id}}">{{$value.name}}</option>
                        {{/if}}
                    {{/each}}
                </select>
            </div>
        </script>
        <script type="text/javascript" src="node_modules/jquery/dist/jquery.js"></script>
        <script type="text/javascript">
            function get(url){
                return new Promise(function(resolve,reject){
                    var xhr;
                    if (window.XMLHttpRequest) {
                        xhr = new XMLHttpRequest()
                    } else {
                        xhr = new ActiveXObject("Microsoft.XMLHTTP")
                    }
                    xhr.open('get',url, true)
                    xhr.send()
                    xhr.onreadystatechange = function() {
                        if (xhr.readyState == 4 && xhr.status == 200) {
                            var responseText = xhr.responseText
                            /*callback(responseText)*/
                            resolve(JSON.parse(responseText))
                        }
                    }
                    /*错误情况*/
                    xhr.onerror = function(error){
                        reject(error)
                    }
                })
            }
            get('http://localhost:3000/users')
                .then(function(data){
                    console.log(data)
                })
    
        </script>
    </body>
    </html>
  • 相关阅读:
    区分服务器和客户端,玩家的控制权
    分割字符串
    switch语句的使用
    博客暂停使用
    [题解]洛谷P1041 传染病控制
    [题解]洛谷P2668 斗地主
    [题解]洛谷P4017 最大食物链计数
    [题解]洛谷P1983 车站分级
    [OI学习笔记]倍增LCA
    [OI学习笔记]st表
  • 原文地址:https://www.cnblogs.com/fightjianxian/p/12270177.html
Copyright © 2011-2022 走看看