关于AJAX和Promise的面试题

286 阅读2分钟

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();

图片.png

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。 图片.png

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