当前位置: 首页 > news >正文

JavaScript promise实例——通过XHR获取省份列表

文章目录

    • 需求和步骤
    • 代码示例
    • 效果

需求和步骤

在这里插入图片描述

代码示例

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <!-- 确保IE浏览器使用最新的渲染引擎 -->
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <!-- 设置viewport以确保页面在移动设备上正确显示 -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Promise管理XHR请求</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            padding: 20px;
            max-width: 800px;
            margin: 0 auto;
        }
        
        button {
            padding: 10px 20px;
            background-color: #4CAF50;
            color: white;
            border: none;
            border-radius: 4px;
            cursor: pointer;
            font-size: 16px;
        }
        
        button:hover {
            background-color: #45a049;
        }
        
        .my-p {
            margin-top: 20px;
            padding: 15px;
            background-color: #f5f5f5;
            border-radius: 4px;
            line-height: 1.8;
        }
        
        .log {
            margin-top: 20px;
            padding: 15px;
            background-color: #f8f9fa;
            border: 1px solid #ddd;
            border-radius: 4px;
            font-family: monospace;
            white-space: pre-wrap;
            max-height: 300px;
            overflow: auto;
        }
    </style>
</head>

<body>
    <h2>Promise管理XHR省份列表请求示例</h2>
    <button id="getProvinces">获取省份列表</button>
    <p class="my-p">点击按钮加载省份列表...</p>
    <div class="log" id="log">日志输出:</div>

    <script>
        // 添加日志输出函数
        function log(message) {
            console.log(message);
            const logElement = document.getElementById('log');
            logElement.textContent += '\n' + message;
        }
        
        // 监听按钮点击事件
        document.getElementById('getProvinces').addEventListener('click', () => {
            log('按钮被点击,开始请求省份列表...');
            // 调用获取省份列表的函数
            getProvinceList();
        });
        
        // 获取省份列表函数
        function getProvinceList() {
            // 目标:使用Promise管理XHR请求省份列表
            log('开始创建Promise...');
            
            // 1.创建Promise对象
            const p = new Promise((resolve, reject) => {
                log('Promise回调函数开始执行');
                
                // 2.执行XHR异步代码,获取省份列表
                const xhr = new XMLHttpRequest();
                log('创建XHR对象成功');
                
                xhr.open('GET', 'http://hmajax.itheima.net/api/province');
                log('配置请求方法和URL完成');
                
                xhr.addEventListener('loadend', () => {
                    log(`XHR请求完成,状态码: ${xhr.status}`);
                    log(`响应数据: ${xhr.response}`);
                    
                    // xhr如何判断响应成功还是失败的?
                    // 2xx开头的都是成功响应状态码
                    if (xhr.status >= 200 && xhr.status < 300) {
                        log('XHR请求成功,触发resolve...');
                        resolve(JSON.parse(xhr.response));
                    } else {
                        log('XHR请求失败,触发reject...');
                        reject(new Error(xhr.response));
                    }
                });
                
                // 监听错误事件
                // loadend事件只能捕获到服务器返回的错误(如404、500等HTTP错误)
                // 但无法捕获到请求根本没有到达服务器的情况
                // error事件填补了这个空缺,处理网络层面的错误
                xhr.addEventListener('error', () => {
                    log('XHR请求发生网络错误');
                    reject(new Error('网络错误,请检查您的网络连接'));
                });
                
                log('准备发送XHR请求...');
                xhr.send();
                log('XHR请求已发送,等待响应...');
            });
            
            // 3.关联成功或失败函数,做后续处理
            log('关联Promise的成功和失败处理函数...');
            p.then(result => {
                log('Promise已成功解决(resolved)');
                log(`解析后的结果: ${JSON.stringify(result)}`);
                
                // 将省份列表显示在页面上
                document.querySelector('.my-p').innerHTML = result.list.join('<br>');
            }).catch(error => {
                log('Promise已拒绝(rejected)');
                
                // 错误对象要用console.dir详细打印
                console.dir(error);
                log(`错误信息: ${error.message}`);
                
                // 服务器返回错误提示消息,插入到p标签显示
                document.querySelector('.my-p').innerHTML = error.message;
            });
        }
    </script>
</body>

</html>

效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

相关文章:

  • 4-c语言中的数据类型
  • OSCP - HTB - BoardLight
  • 网络钓鱼攻击的威胁和执法部门的作用(第二部分)
  • TensorRT 有什么特殊之处
  • LLM 部署(1)——LLM 部署框架对比
  • 开源身份和访问管理方案之keycloak(三)keycloak健康检查(k8s)
  • ollama更新升级及警告解决
  • 过孔的载流能力
  • 深度解析需求分析:理论、流程与实践
  • 2011-2019年各省地方财政金融监管支出数据
  • 个人博客系统——测试报告
  • Spring 中的 BeanFactory 和 ApplicationContext
  • V-SHOW和箭头函数在VUE项目的踩坑点
  • Excel + VBA 实现“准实时“数据的方法
  • 类与对象(上)
  • 每日一题(小白)字符串娱乐篇16
  • Python星球日记 - 第5天:循环结构
  • 代码随想录算法训练营Day20
  • 【USTC 计算机网络】第三章:传输层 - 面向连接的传输:TCP
  • 【堆排序】 及 【Top-K问题】
  • 网站建设工作室北京小俊哥/每日财经要闻
  • 做百度联盟怎么才能创建多个网站/google关键词seo
  • 冠县哪里有做网站的/优化推广网站怎么做
  • 彩票推广网站如何做/百度引擎入口官网
  • 惠州网页模板建站/买卖网交易平台
  • 网站标题做参数/sq网站推广