Ajax

185 阅读2分钟

juejin.im/post/587f8d…

Ajax(Asynchronous JavaScript and XML)不是指一种单一的技术,而是有机地利用了一系列相关的技术。虽然其名称包含XML,但实际上数据格式可以由JSON代替,进一步减少数据量,形成所谓的AJAJ。为了使用JavaScript向服务器发出 HTTP 请求,需要一个提供此功能的类的实例。这就是XMLHttpRequest的由来。

AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。

优点缺点ajax属性:方法:
1.无刷新更新数据。2.异步与服务器通信。3.前端和后端负载平衡。4.基于标准被广泛支持。5.界面与应用分离。1.AjAX干掉了Back和加入收藏书签功能,即对浏览器机制的破坏。2.AJAX的安全问题。3.因为网络延迟需要给用户提供必要提示onreadystatechangereadyStateresponseTextresponseXMLstatusstatusTextabort()open()send()getAllResponseHeaders()getResponseHeader()setRequestHeader()
document.getElementById("search").onclick = function () {
  var request = newXMLHttpRequest(); //生成XHR对象;
  request.open(
    "GET",
    "server.php?number=" + document.getElementById("keyword").value
  );
  //XHR对象的open方法:请求方法:get;请求地址:server.php,参数为输入的编号;
  request.send(); //发送请求
  //监听request的状态的改变:readyState的改变:
  request.onreadystatechange = function () {
    if (request.readyState == 4) {
      //如果readyState为4即服务器响应已完成;
      if (request.status === 200) {
        //如果request的状态码为200;
        document.getElementById("searchResult").innerHTML =
          request.responseText; //将查询结果显示;
      } else {
        alert("发生错误" + request.status);
      }
    }
  };
};

从ajax到fetch、axios

jquery ajax:

它是对原生XHR的封装,还支持JSONP,非常方便

$.ajax({
  type: "POST",
  url: url,
  data: data,
  dataType: dataType,
  success: function () {},
  error: function () {},
});

fetch

fetch号称是ajax的替代品,再搭配上async/await将会让我们的异步代码更加优雅:像同步代码一样。

(它的API是基于Promise设计的,旧版本的浏览器不支持Promise,需要使用polyfill es6-promise。)

async function test() {
  let response = await fetch(url);
  let data = await response.json();
  console.log(data);
}

axios

axios是尤雨溪大神推荐使用的,它也是对原生XHR的封装。它有以下几大特性:

  • 可以在node.js中使用
  • 提供了并发请求的接口
  • 支持Promise API
axios({ method: "GET", url: url })
  .then((res) => {
    console.log(res);
  })
  .catch((err) => {
    console.log(err);
  });

并发请求

function getUserAccount() {
  return axios.get("/user/12345");
}
function getUserPermissions() {
  return axios.get("/user/12345/permissions");
}
axios.all([getUserAccount(), getUserPermissions()]).then(
  axios.spread(function (acct, perms) {
    // Both requests are now complete
  })
);