封装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>

 

posted @ 2020-02-06 20:17  剑仙6  阅读(508)  评论(0编辑  收藏  举报
欢迎访问个人网站www.qingchun.在线