手写 AJAX:从零实现一个简洁的异步请求函数

手写 AJAX:从零实现一个简洁的异步请求函数

前言

在现代前端开发中,fetchaxios 等工具库已经大大简化了异步请求的编写。但在某些情况下,我们仍然需要深入了解 AJAX 的底层实现,尤其是在学习 JavaScript 语言核心的过程中。今天,我们将从零开始,手写一个 AJAX 请求函数,并封装成一个基于 PromisegetJSON 方法。

什么是 AJAX?

AJAX(Asynchronous JavaScript and XML)是一种用于创建异步 Web 应用的技术,允许网页在不重新加载的情况下从服务器获取数据。现代 AJAX 主要使用 JSON 作为数据格式,而不是早期的 XML。

手写 AJAX 请求

以下是我们手写的 getJSON 方法,它通过 XMLHttpRequest 发送 GET 请求,并返回 Promise 以支持异步操作。

代码实现

xml 复制代码
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>手写Ajax</title>
</head>
<body>
    <script>
        const getJSON = function(url) {
            return new Promise((resolve, reject) => {
                const xhr = window.XMLHttpRequest
                    ? new XMLHttpRequest()
                    : new ActiveXObject("Microsoft.XMLHTTP"); // 兼容早期IE浏览器
                
                xhr.open('GET', url, true);
                xhr.onreadystatechange = function() {
                    if (xhr.readyState !== 4) return;
                    if (xhr.status === 200 || xhr.status === 304) {
                        resolve(JSON.parse(xhr.responseText)); // 解析 JSON 数据
                    } else {
                        reject(new Error(`请求失败,状态码:${xhr.status}`));
                    }
                };
                xhr.send();
            });
        };

        getJSON('https://api.github.com/orgs/lemoncode/members')
        .then(data => {
            console.log("请求成功:", data);
        })
        .catch(error => {
            console.error("请求失败:", error);
        });
    </script>
</body>
</html>

代码解析

  1. 兼容性处理

    • 通过 window.XMLHttpRequest 选择 XMLHttpRequest,如果浏览器不支持(如 IE 早期版本),则使用 ActiveXObject
  2. 创建异步请求

    • xhr.open('GET', url, true); 这里的 true 代表异步操作。
  3. 监听 readystatechange 事件

    • xhr.readyState === 4 代表请求已完成。
    • xhr.status === 200 || xhr.status === 304 代表请求成功。
    • 解析 JSON 数据后返回。
  4. 使用 Promise

    • 通过 resolve 返回数据,reject 处理错误,增强可读性。

对比 fetch API

fetch 是现代浏览器提供的原生 API,它可以用更简洁的方式来实现相同的功能,例如:

ini 复制代码
fetch('https://api.github.com/orgs/lemoncode/members')
    .then(response => response.json())
    .then(data => console.log(data))
    .catch(error => console.error(error));

相比之下,fetch 语法更简洁,且默认返回 Promise,不需要手动封装。但理解 XMLHttpRequest 的底层实现对于深入学习 JavaScript 仍然很有帮助。

总结

本篇文章带你从零实现了一个 getJSON 方法,它使用 XMLHttpRequest 进行 AJAX 请求,并通过 Promise 进行封装,使得代码更易读、更符合现代 JavaScript 编程风格。虽然现在我们更多使用 fetchaxios,但掌握 AJAX 的底层实现有助于我们更好地理解前端开发的本质。

相关推荐
wuk9981 小时前
梁非线性动力学方程MATLAB编程实现
前端·javascript·matlab
XiaoYu20021 小时前
第11章 LangChain
前端·javascript·langchain
霉运全滚蛋好运围着转1 小时前
启动 Taro 4 项目报错:Error: The specified module could not be found.
前端
cxxcode1 小时前
前端模块化发展
前端
不务正业的前端学徒2 小时前
docker+nginx部署
前端
不务正业的前端学徒2 小时前
webpack/vite配置
前端
hhcccchh2 小时前
学习vue第八天 Vue3 模板语法和内置指令 - 简单入门
前端·vue.js·学习
yyf198905252 小时前
Vue 框架相关中文文献
前端·javascript·vue.js
粥里有勺糖2 小时前
开发一个美观的 VitePress 图片预览插件
前端·vue.js·vitepress
行者962 小时前
Flutter适配OpenHarmony:国际化i18n实现中的常见陷阱与解决方案
开发语言·javascript·flutter·harmonyos·鸿蒙