0

0

使用Promise封装XMLHttpRequest

煙雲

煙雲

发布时间:2025-07-10 23:23:02

|

192人浏览过

|

来源于php中文网

原创

用promise封装xmlhttprequest的核心目的是告别回调地狱,实现链式调用和集中错误处理。1. 定义一个返回promise的函数,在其中执行xmlhttprequest逻辑,成功时resolve响应数据,失败时reject错误信息;2. 支持不同http方法和数据发送,通过配置对象传入method、url、data、headers等参数,并根据method类型决定是否序列化data并设置content-type头;3. 优雅处理错误和超时,分别监听xhr.onload、xhr.onerror、xhr.ontimeout、xhr.onabort事件,依据不同情况触发reject,实现统一的错误捕获机制;4. 使用示例中展示了get和post请求的调用方式,体现封装后的易用性和灵活性。

使用Promise封装XMLHttpRequest

用Promise封装XMLHttpRequest,这事儿说白了,就是把那些老旧的、基于回调的异步请求,套上一层现代化的外套,让它变得更易读、更易管理。核心目的就是告别“回调地狱”,让异步操作链式化,逻辑清晰明了。

使用Promise封装XMLHttpRequest

解决方案

我个人在项目里封装XMLHttpRequest时,通常会这样做:定义一个函数,返回一个Promise实例。在这个Promise里,我们执行XMLHttpRequest的逻辑,成功就resolve,失败就reject。

function request(options) {
    return new Promise((resolve, reject) => {
        const xhr = new XMLHttpRequest();
        const { method = 'GET', url, data = null, headers = {} } = options;

        xhr.open(method.toUpperCase(), url, true);

        // 设置请求头
        Object.keys(headers).forEach(key => {
            xhr.setRequestHeader(key, headers[key]);
        });

        xhr.onload = function() {
            if (xhr.status >= 200 && xhr.status < 300) {
                try {
                    // 尝试解析JSON,如果不是JSON,就返回原始文本
                    resolve(JSON.parse(xhr.responseText));
                } catch (e) {
                    resolve(xhr.responseText);
                }
            } else {
                // HTTP状态码表示错误
                reject(new Error(`请求失败:${xhr.status} ${xhr.statusText}`));
            }
        };

        xhr.onerror = function() {
            // 网络错误或请求被阻止
            reject(new Error('网络错误或请求被中止。'));
        };

        xhr.ontimeout = function() {
            // 请求超时
            reject(new Error('请求超时。'));
        };

        xhr.onabort = function() {
            // 请求被取消
            reject(new Error('请求已取消。'));
        };

        // 发送请求,对于POST/PUT等方法,可能需要发送数据
        if (method.toUpperCase() === 'POST' || method.toUpperCase() === 'PUT') {
            xhr.send(JSON.stringify(data)); // 假设发送JSON数据
        } else {
            xhr.send();
        }
    });
}

// 示例用法:
// request({
//     method: 'GET',
//     url: 'https://api.example.com/data'
// })
// .then(response => {
//     console.log('GET请求成功:', response);
// })
// .catch(error => {
//     console.error('GET请求失败:', error);
// });

// request({
//     method: 'POST',
//     url: 'https://api.example.com/submit',
//     headers: {
//         'Content-Type': 'application/json'
//     },
//     data: {
//         name: 'Alice',
//         age: 30
//     }
// })
// .then(response => {
//     console.log('POST请求成功:', response);
// })
// .catch(error => {
//     console.error('POST请求失败:', error);
// });

为什么我们还需要用Promise封装XMLHttpRequest?

说实话,现在前端开发,大家更习惯用fetch API,它本身就返回Promise,用起来很方便。但总有些老项目,或者在一些特定环境下,我们还是得面对XMLHttpRequest。我记得刚开始写前端的时候,那回调嵌套一层又一层,看得人头皮发麻,错误处理也零散得不行。用Promise封装它,最直接的好处就是把那种“回调地狱”彻底铲除。

使用Promise封装XMLHttpRequest

你想啊,一个请求依赖另一个请求的结果,或者多个请求需要并行处理,如果还是纯回调,代码很快就变得难以阅读和维护。Promise提供了一种更优雅的链式调用方式(.then().then()),让异步流程看起来像同步代码一样直观。而且,它的错误处理机制也更集中,一个.catch()就能捕获链路上任何一个环节的错误,这比每个回调里都写if (error)要省心多了。对我来说,这不仅是代码风格的提升,更是开发效率和心态上的解放。

如何让封装后的请求支持不同HTTP方法和数据发送?

在上面的解决方案里,其实已经体现了这一点。关键在于封装函数能够接收一个配置对象(options),而不是固定写死请求类型。我通常会把methodurldataheaders这些作为参数传进去。

使用Promise封装XMLHttpRequest

对于method,我们可以在xhr.open()里动态设置。data参数就更灵活了,如果是GET请求,数据通常拼接在URL后面;但对于POST或PUT这种需要发送请求体的,我们就得用xhr.send()来发送数据了。这里有个小细节,xhr.send()默认接收的是字符串,所以如果我们要发送JSON对象,记得用JSON.stringify()转换一下,并且别忘了设置Content-Type: application/json的请求头,告诉服务器你发的是JSON数据。这样一来,无论是GET请求获取列表,还是POST请求提交表单,甚至是PUT更新资源,都能用这一个封装函数搞定,挺方便的。

佳蓝在线销售系统(创业版) 佳蓝在线销售
佳蓝在线销售系统(创业版) 佳蓝在线销售

1、对ASP内核代码进行DLL封装,从而大大提高了用户的访问速度和安全性;2、采用后台生成HTML网页的格式,使程序访问速度得到进一步的提升;3、用户可发展下级会员并在下级购买商品时获得差额利润;4、全新模板选择功能;5、后台增加磁盘绑定功能;6、后台增加库存查询功能;7、后台增加财务统计功能;8、后台面值类型批量设定;9、后台财务曲线报表显示;10、完善订单功能;11、对所有传输的字符串进行安全

下载

封装时如何更优雅地处理错误和超时?

错误处理是异步请求的重中之重,我个人觉得,比请求成功还重要。在XMLHttpRequest里,错误和超时是两种不同的情况。

首先是网络错误或请求被阻止,这通常通过xhr.onerror事件来捕获。比如用户断网了,或者请求被浏览器安全策略(CORS)阻止了,都会触发这个。这种错误通常发生在请求发送出去但还没收到响应的阶段,或者根本就没能发送出去。

接着是HTTP状态码错误,比如404 Not Found、500 Internal Server Error这些。这发生在xhr.onload事件内部,表示请求已经到达服务器并得到了响应,但响应的状态码表示业务逻辑上的失败。这时候,我们就可以根据xhr.status来判断,如果不在2xx范围内,就认为是错误并调用reject

然后是超时xhr.ontimeout事件专门处理这个问题。你可以通过xhr.timeout = milliseconds来设置一个超时时间,如果在这个时间内没有收到响应,就会触发ontimeout。这对于用户体验很重要,总不能让用户一直等着一个没有响应的请求吧。

最后是请求取消。有时候用户会切换页面,或者我们主动取消一个正在进行的请求,这时xhr.onabort就会被触发。在Promise里,我们把这些情况都统一通过reject抛出去,这样外部.catch()就能统一捕获并处理。这种集中式的错误处理,让代码逻辑清晰了很多,维护起来也省心。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

412

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

533

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

310

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

75

2025.09.10

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

751

2023.08.22

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

187

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

288

2023.10.25

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

258

2023.08.03

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

23

2026.01.19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
如何进行WebSocket调试
如何进行WebSocket调试

共1课时 | 0.1万人学习

TypeScript全面解读课程
TypeScript全面解读课程

共26课时 | 5万人学习

前端工程化(ES6模块化和webpack打包)
前端工程化(ES6模块化和webpack打包)

共24课时 | 5.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号