zoukankan      html  css  js  c++  java
  • 前端随心记---------Axios/fetch/ajax的区别

    一.jQuery  ajax

    $.ajax({
       type: 'POST',
       url: url,
       data: data,
       dataType: dataType,
       success: function () {},
       error: function () {}
    });
      传统 Ajax 指的是 XMLHttpRequest(XHR), 最早出现的发送后端请求技术,隶属于原始js中,核心使用XMLHttpRequest对象,多个请求之间如果有先后关系的话,就会出现回调地狱

      JQuery ajax 是对原生XHR的封装,除此以外还增添了对JSONP的支持。经过多年的更新维护,真的已经是非常的方便了,优点无需多言;如果是硬要举出几个缺点,那可能只有:

    1.本身是针对MVC的编程,不符合现在前端MVVM的浪潮
    2.基于原生的XHR开发,XHR本身的架构不清晰。
    3.JQuery整个项目太大,单纯使用ajax却要引入整个JQuery非常的不合理(采取个性化打包的方案又不能享受CDN服务)
    4.不符合关注分离(Separation of Concerns)的原则
    5.配置和调用方式非常混乱,而且基于事件的异步模型不友好。

    二.axios
    axios({
        method: "post",
        url: "/user/12345",
        data: {
          firstName: "liu",
          lastName: "weiqin"
        }
      })
      .then(res => console.log(res))
      .catch(err => console.log(err))

     vue2.0之后,尤雨溪推荐使用axios来请求数据。

    Axios是一个基于promiseHTTP库,可以用在浏览器和 node.js 中。它本质也是对原生XMLHttpRequest的封装,只不过它是Promise的实现版本,符合最新的ES规范。

    优点

    1. 从浏览器中创建XMLHttpRequests
    2. 从 node.js 创建 http 请求
    3. 支持 Promise API
    4. 拦截请求和响应
    5. 转换请求数据和响应数据
    6. 取消请求
    7. 自动转换 JSON 数据
    8. 客户端支持防御 XSRF

    缺点

    1. 只持现代代浏览器.

    三.fetch

    fetch号称是AJAX的替代品,是在ES6出现的,使用了ES6中的promise对象。Fetch是基于promise设计的。Fetch的代码结构比起ajax简单多了,参数有点像jQuery ajax。但是,一定记住fetch不是ajax的进一步封装,而是原生js,没有使用XMLHttpRequest对象
    fetch的优点:
    1.符合关注分离,没有将输入、输出和用事件来跟踪的状态混杂在一个对象里
    2.更好更方便的写法

    优势:跨域的处理
    在配置中,添加mode: "no-cors"就可以跨域了.
    fetch("/users.json", {
        method: "post", 
        mode: "no-cors",
        data: {}
    }).then(function() { /* handle response */ });
    1)fetch只对网络请求报错,对400,500都当做成功的请求,需要封装去处理
    2)fetch默认不会带cookie,需要添加配置项
    3)fetch不支持abort,不支持超时控制,使用setTimeout及Promise.reject的实现的超时控制并不能阻止请求过程继续在后台运行,造成了流量的浪费
    4)fetch没有办法原生监测请求的进度,而XHR可以

              fetch是一个低层次的API,你可以把它考虑成原生的XHR,所以使用起来并不是那么舒服,需要进行封装

    请注意,fetch规范与jQuery.ajax()主要有两种方式的不同,牢记:
    
    -. 当接收到一个代表错误的 HTTP 状态码时,从 fetch()返回的 Promise 不会被标记为 reject, 即使该 HTTP 响应的状态码是 404 或 500。相反,它会将 Promise 状态标记为 resolve (但是会将 resolve的返回值的 ok 属性设置为 false ),仅当网络故障时或请求被阻止时,才会标记为 reject。
    
    -. 默认情况下,fetch 不会从服务端发送或接收任何 cookies, 如果站点依赖于用户 session,则会导致未经认证的请求(要发送 cookies,必须设置 credentials 选项)。
    集思广益,仅供学习,侵权即删!!
  • 相关阅读:
    数学基础详解 1——微积分
    logistic回归梯度上升优化算法
    决策树
    西瓜书学习笔记(1)——模型评估与选择
    关于map与set的一点理解;
    STL中的set容器的一点总结(转)
    HDOJ 题目分类
    Train Problem I(栈)
    猜数字(规律)
    Change the ball(找规律)
  • 原文地址:https://www.cnblogs.com/hudunyu/p/11846282.html
Copyright © 2011-2022 走看看