AJAX(二)

原生XHR对象使用

用聚合的身份证查询api做个小栗子
https://www.juhe.cn/docs/api/id/38

需求描述:

  • 一个输入框,一个提交按钮.
  • 输入框可以输入身份证号, 提交按钮提交后在界面显示身份信息.

代码部分

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>AjaxTest</title>
</head>
<body>
    <input id='myInput' type="text" >
    <button id='myButton' onclick="handleSubmit()">Click To Down Load</button>
    <div id='myDisplay'></div>
>
    <script>
        const myKey = '0a8c23653d43f9a476add0d0ed833472';
>
        function renderHTML(data){
            let myDisplay = document.getElementById('myDisplay');
            myDisplay.innerHTML = data;
        };
>
        function formatInfo(data){
            let parseData = JSON.parse(data); 
            let area = parseData.result.area;
            let sex = parseData.result.sex;
            let birthday = parseData.result.birthday;
            let result = '您的出生地为:' + area + '  您的性别为:' + sex + '  您的生日为:' + birthday;
            return result;
        };
>
        function handleSubmit(){
            let myCard = document.getElementById('myInput').value;
            let myURL = 'http://apis.juhe.cn/idcard/index?key=' + myKey + '&cardno=' + myCard;
            var myXHR = (window.XMLHttpRequest) ? new XMLHttpRequest() : new ActiveXObject();
>
            myXHR.onreadystatechange = function() {
                if (myXHR.readyState === 4) {
                    if (myXHR.status === 200) {
                        let myValue = formatInfo(myXHR.responseText);
                        renderHTML(myValue);}
                    else {renderHTML('请求失败,请重试');}
                }
                else { renderHTML('Loading...') ;}
            };
>
            myXHR.open('GET',myURL);
            myXHR.send();
        };
    </script>
</body>
</html>

说明

其实如果输入错的格式,API那边也会返回200,但是JSON体内带返回码.
上面的代码只是一个默认的格式,回调都可以自己乱写,如果API内带返回码还需要根据返回码做不同操作.实际上更简单了.

思考部分

可以看到上述代码中,handleSubmit部分其实复用度需求是很高的,但是不方便将回调函数和复用部分分离开, 就是说耦合性太强了.
实际上handleSubmit句柄处理的主要部分主要是HTTP部分.如果这部分能单独抽离出来.
ES6支持的promise的API对这部分实现的更好. 之后继续对promise分析代码部分.

推荐阅读更多精彩内容