1.什么是AJAX?
答:AJAX指的是通过JavaScript的异步通信,控制浏览器发送请求和接受响应,也就是用JavaScript脚本发起Http通信。
- AJAX是浏览器上的功能,作用是用js发送请求和接受响应;
- 浏览器在window上加了一个XMLHttpRequest函数,用这个构造函数(类)可以构造出一个对象
- AJAX是一种轻量级的请求
2.原生js ajax请求有几个步骤?
①创建XMLHttpRequest请求对象:const request = new XMLHttpRequest();
②调用对象的open方法(规定请求的类型,URL以及是否异步处理,true代表将ajax设置成异步):request.open('GET','a/b/c?name=jiu',true);
③监听对象的onreadystatechang:
request.onreadystatechange = function(){
if(request.readState====4 && request.status===200){
//响应成功你要做的操作
}
};
④发送请求:request.send();
const request = new XMLHttpRequest();
request.open('GET','a/b/c',true);
request.onreadystatechange(){
if( request.readyState===4&&request.status===200){
}}
request.send();
3.Ajax的异步与同步,我们在使用 ajax 一般都会使用异步处理。
- 异步处理呢就是我们通过事件触发到 ajax,请求服务器,在这个期间无论服务器有没有响应,客户端的其他代码一样可以运行。
- request.send()之后,并不能直接的到response,必须等到readyState变为4后,浏览器回头调用request.onreadystatechange函数才能得到。
- request.onreadystatechange函数,是写给浏览器让浏览器回头调用以下的函数,简称回调函数。
- 回调函数:写给别人调用的函数。
- 同步处理:我们通过实践触发 ajax,请求服务器,在这个期间等待服务器处理请求, 在这个期间客户端不能做任何处理。当 ajax 执行完毕才会继续执行其他代码。
4.我们为什么要用promise:
- 使用promise的原因就是因为在接收异步结果时:
- 1.方法不规范,没有成文的规定。
- 2.容易出现回调地狱,代码看不懂。
- 3.很难进行错误处理。
- promise做到了:
- 1.规范回调名字或顺序。
- 2.拒绝回调地狱,让代码可读性更强。
- 3.很方便的捕捉错误。
5.如和在ajax中使用promise.
//不是promise,我们应该这么写ajax
ajax = (method,url,options)=>{
const {success,fail} = options
const request = new XMLHttpRequest()
request.open(method,url)
request.onreadystatechange = ()=>{
if(request.readyState === 4){
if(request.status<400){
success.call(null,request.response)
}else if(request.status >= 400){
fail.call(null,request,request.status)
}
}
}
request.send()
}
//调用
ajax('get','/xxx',{
success(response){},fail:(request,status)=>{}
})
- 使用promise调用
- .then的第一个参数是success,第二个参数是fail;
- ajax返回了一个含有.then方法的对象
ajax('get','/xxx').then((response)=>{},(request)=>{})
- 整个ajax的函数体就是return new Promise然后传了一个函数。传了两个参数,成功了调用resolve,失败了调用reject。
6.Promise.all
Promise.all()方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。
Promise.all([promise1, promise2]).then(success1, fail1)
promise1和promise2都成功才会调用success1
7.Promise.race
Promise.race()方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例。
Promise.race([promise1, promise2]).then(success1, fail1)
promise1和promise2只要有一个成功就会调用success1