AJAX原理

AJAX原理

1、XMLHttpRequest

1.1 基本定义

XMLHttpRequest(简称XHR)对象,它被用于与服务器交互。

我们可以通过XHR在不刷新页面的情况下请求特定URL,获取数据。

axios库内部就是采用XHR与服务器进行交互的。

它的使用语法如下:

// 1.先创建XMLHttpRequest 对象
const xhr = new XMLHttpRequest();
// 2.配置请求方法和请求 url 地址
xhr.open("GET", "url地址");
//  3.监听 loadend 事件,接收响应结果
xhr.addEventListener("loadend", function () {
    console.log(xhr.response); // 一个JSON字符串,ajax自动把它转化为对象了
});
//  4.发送请求
xhr.send(); // 发送请求一定要有,不然就类似于写了函数没调用
1.2 运用查询参数

在引用axios库后,我们使用查询参数只需要添加params

axios({
    url: "",
    params: {
        pname: "",
        cname: "",
    },
})

使用XML对象的话,就要用以下的方式:

const pname = document.querySelector(".province").value;
const cname = document.querySelector(".city").value;

// 组织查询参数
const qObj = {
    pname,
    cname,
};
// 查询参数->查询参数字符串
const paramsObj = new URLSearchParams(qObj);
const querryString = paramsObj.toString();

const xhr = new XMLHttpRequest();
xhr.open("GET", `https://XXX/XXX?${querryString}`); // 手动添加到url地址?后
1.3 数据提交(请求头、请求体)

引用axios库后,添加data参数即可:

axios({
    url: "",
    method: "post",
    data: {
        username: "1234567",
        password: "7654321",
    },
})

运用XHR实现的话,就要自己设置:

// 设置请求头-告诉服务器内容类型(JSON字符串)
xhr.setRequestHeader("Content-Type", "application/json");

// 要提交的数据,并转化成JSON字符串
const userObj = {
    username: "1234567",
    password: "7654321",
};
const userstr = JSON.stringify(userObj);  
// 设置请求体
xhr.send(userstr); // 请求体写在send里面

2、Promise

2.1 基本定义

Promise对象用于表示一个异步操作的最终完成(或失败)及其结果值。

语法:

const p = new Promise((resolve, reject) => {
    setTimeout(() => {
        // 执行异步代码并传值结果
        // 成功调用:resolve(值)触发 then()执行
        // 失败调用:reject(值)触发 catch()执行
        // resolve("模拟AJAX请求——成功结果");
        reject(new Error("请求失败"));
    }, 2000);
});

// 结果处理
p.then((result) => {
    console.log(result);
}).catch((error) => {
    console.log(error);
});
2.2 三种状态
  • pending:初始状态,还没有兑现,也没有被拒绝。
  • fulfilled:操作成功(兑现)
  • rejected:操作失败(拒绝)

Promise 对象一旦被 兑现/拒绝,就无法再被改变。

// 创建Promise对象——刚创建就处于pending 待定状态
const p = new Promise((resolve, reject) => {
    setTimeout(() => {
        // resolve => 状态:'fulfilled' => then()
        resolve("模拟AJAX请求-成功结果");
        // reject => 状态:'rejected' => catch()
        reject(new Error("模拟AJAX请求-失败结果"));
    }, 2000);
});
console.log(p);

p.then((result) => {
    console.log(result);
}).catch((error) => {
    console.log(error);
});

3、封装简易版axios

XMLHttpRequest和Promise对象自己封装一个简易axios,实现类似于调用axios的效果:

axios({
    url: "目标资源地址",
    method:'post', 	//	指定请求方法
    data:{
        //	要提交的数据
    },
    params:{
        //	查询参数
    }
}).then((result) => {
    //	对服务器返回数据进行后续处理
}).catch(error=>{
    //	处理错误
})

分析:

在这里插入图片描述

3.1 实现获取省份列表
// config就是配置对象
function myAxios(config) {
    return new Promise((resolve, reject) => {
        const xhr = new XMLHttpRequest();
        xhr.open(config.method || "GET", config.url); 
        // 使用逻辑中断,如果有设置method就用设置的,没有默认get
        xhr.addEventListener("loadend", () => {
            // 成功响应状态码
            if (xhr.status >= 200 && xhr.status < 300) {
                resolve(JSON.parse(xhr.response));
            } else {
                reject(new Error(xhr.response));
            }
        });
        xhr.send();
    });
}
myAxios({
    url: "https://hmajax.itheima.net/api/province",
}).then((result) => {
    document.querySelector(".my-p").innerHTML = result.list.join("<br>");
}).catch((error) => {
    document.querySelector(".my-p").innerHTML = error.message;
});
3.2 实现获取地区列表

在3.1的基础上加上了查询参数的实现

function myAxios(config) {
    return new Promise((resolve, reject) => {
        const xhr = new XMLHttpRequest();
        if (config.params) {
            // 使用URLSearchParams转换,并携带到url上
            const params = new URLSearchParams(config.params);
            const pos = params.toString();

            // console.log(pos);
            config.url += `?${pos}`;
        }
        xhr.open(config.method || "GET", config.url);
        xhr.addEventListener("loadend", () => {
            if (xhr.status >= 200 && xhr.status < 300) {
                resolve(JSON.parse(xhr.response));
            } else {
                reject(new Error(xhr.response));
            }
        });
        xhr.send();
    });
}

myAxios({
    url: "https://hmajax.itheima.net/api/area",
    params: {
        pname: "广东省",
        cname: "广州市",
    },
}).then((result) => {
    // console.log(result);
    document.querySelector(".my-p").innerHTML = result.list.join("<br>");
}).catch((error) => {
    document.querySelector(".my-p").innerHTML = error.message;
});
3.3 注册用户

实现了数据的提交

function myAxios(config) {
    return new Promise((resolve, reject) => {
        const xhr = new XMLHttpRequest();
		
		// 3.2实现
        if (config.params) {
            const paramsObj = new URLSearchParams(config.params);
            const queryString = paramsObj.toString();
            config.url += `?${queryString}`;
        }
        xhr.open(config.method || "GET", config.url);

        xhr.addEventListener("loadend", () => {
            if (xhr.status >= 200 && xhr.status < 300) {
                resolve(JSON.parse(xhr.response));
            } else {
                reject(new Error(xhr.response));
            }
        });
        // 判断是否有data,携带请求体
        if (config.data) {
            // 转换数据类型,在send中发送
            const jsonStr = JSON.stringify(config.data);
            // 设置请求体内容类型标记
            xhr.setRequestHeader("Content-Type", "application/json");
            xhr.send(jsonStr);
        } else {
            xhr.send();
        }
    });
}
document.querySelector(".reg-btn").addEventListener("click", () => {
    myAxios({
        url: "https://hmajax.itheima.net/api/register",
        method: "POST",
        data: {
            username: "12356789",
            password: "1234424",
        },
    }).then((result) => {
        console.log(result);
    }).catch((error) => {
        console.dir(error);
    });
});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Ajax(Asynchronous JavaScript and XML)是一种在Web应用程序中创建交互式用户体验的技术。其原理是通过JavaScript在不重新加载整个页面的情况下,向服务器请求数据并更新页面的部分内容。 具体实现步骤如下: 1. 创建 XMLHttpRequest 对象 在 JavaScript 中,使用 XMLHttpRequest 对象来实现 Ajax。创建 XMLHttpRequest 对象的代码如下: ``` var xhr = new XMLHttpRequest(); ``` 2. 发送请求 使用 XMLHttpRequest 对象的 open() 和 send() 方法来发送请求。代码如下: ``` xhr.open('GET', 'url', true); xhr.send(); ``` 其中,第一个参数是请求类型(GET 或 POST),第二个参数是请求地址,第三个参数是指定请求是否异步执行。 3. 接收数据 当服务器响应请求时,会触发 XMLHttpRequest 对象的 onreadystatechange 事件。通过判断 readyState 属性和 status 属性的值,可以确定服务器响应的状态。如果响应成功,可以通过 responseText 或 responseXML 属性获取服务器返回的数据。代码如下: ``` xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { var data = xhr.responseText; // 处理返回的数据 } } ``` 4. 处理数据 根据服务器返回的数据格式,使用 JavaScript 对返回的数据进行处理,并将结果更新到页面上。 以上就是 Ajax 的基本原理和实现步骤。需要注意的是,Ajax 可能会存在跨域问题,需要在服务器端进行相应的配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值