ajax和fetch的区别

本文深入解析了Ajax与fetch这两种常见的前端数据请求技术。Ajax通过XMLHttpRequest对象进行异步数据请求,而fetch则利用Promise机制简化了异步操作,两者在处理HTTP错误和cookie方面存在差异。文章还提供了fetch的错误处理和cookie发送的代码示例。

一、Ajax

Ajax的本质是使用XMLHttpRequest对象来请求数据,下面简单贴下原生js实现:

function ajax(url, fnSucc, fnFaild)
{
    //1.创建Ajax对象
    if(window.XMLHttpRequest){
       var oAjax=new XMLHttpRequest();
    }else{
       var oAjax=new ActiveXObject("Microsoft.XMLHTTP");
    }

 

   2.连接服务器(打开和服务器的连接)
    oAjax.open('GET', url, true);

   3.发送
    oAjax.send();

   4.接收
    oAjax.onreadystatechange=function (){
       if(oAjax.readyState==4){
           if(oAjax.status==200){
              //alert('成功了:'+oAjax.responseText);
              fnSucc(oAjax.responseText);
           }else{
              //alert('失败了');
              if(fnFaild){
                  fnFaild();
              }
           }
        }
    };
}

二、fetch

fetch 是全局量 window 的一个方法,它的主要特点有:
1、第一个参数是URL:
2、第二个是可选参数,可以控制不同配置的 init 对象
3、使用了 JavaScript Promises 来处理结果/回调:

链式处理,将异步变为类似单线程的写法: 高级用法.

fetch('/some/url').then(function(response) {
    return . //... 执行成功, 第1步...
}).then(function(returnedValue) {
    // ... 执行成功, 第2步...
}).catch(function(err) {
    // 中途任何地方出错...在此处理 :( 
});

三、fetch规范与jQuery.ajax()主要有两种方式的不同,牢记:

1、从 fetch()返回的 Promise 将不会拒绝HTTP错误状态, 即使响应是一个 HTTP 404 或 500。相反,它会正常解决 (其中ok状态设置为false), 并且仅在网络故障时或任何阻止请求完成时,它才会拒绝。
可以做简单的封装

function checkStatus(response) {
  if (response.status >= 200 && response.status < 300) {
    return response
  } else {
    var error = new Error(response.statusText)
    error.response = response
    throw error
  }
}

function parseJSON(response) {
  return response.json()
}

fetch('/users')
  .then(checkStatus)
  .then(parseJSON)
  .then(function(data) {
    console.log('request succeeded with JSON response', data)
  }).catch(function(error) {
    console.log('request failed', error)
  })

2、默认情况下, fetch在服务端不会发送或接收任何 cookies, 如果站点依赖于维护一个用户会话,则导致未经认证的请求(要发送 cookies,必须发送凭据头).
这一点也可以做一些处理:
如果想要在同域中自动发送cookie,加上 credentials 的 same-origin 选项

fetch(url, {
  credentials: ’same-origin'
})

same-origin值使得fetch处理Cookie与XMLHttpRequest类似。 否则,Cookie将不会被发送,导致这些请求不保留认证会话。

对于CORS请求,使用include值允许将凭据发送到其他域:

fetch(url, {
  credentials: 'include'
})

四、总结

最后fetch采用了Promise的异步处理机制,使用比ajax更加简单,有可能会逐渐代替ajax,对于新技术大家还是要积极探索最好。

<think>好的,我需要解释AjaxFetch区别。首先,我应该回顾一下两者的基本概念。Ajax是Asynchronous JavaScript and XML的缩写,虽然现在更多用JSON代替XML,但这个名字还是保留下来了。它用于在不需要重新加载整个页面的情况下与服务器交换数据并更新部分网页内容。传统的Ajax通常通过XMLHttpRequest对象来实现。而Fetch API是较新的技术,使用Promise来处理异步操作,语法更简洁。 接下来,我需要比较它们的核心区别。首先是语法使用方式。Ajax使用XMLHttpRequest对象,代码结构较为冗长,需要创建实例、设置回调函数、处理状态变化等步骤。而Fetch基于Promise,可以使用更简洁的链式调用,比如.then().catch(),代码更易读维护。 然后是错误处理机制。在Ajax中,HTTP错误状态码(如404或500)不会触发onerror事件,必须手动检查响应状态码。而Fetch只有在网络故障导致请求无法完成时才会拒绝Promise,对于HTTP错误状态码,需要在响应处理中手动检查response.ok或response.status。 第三点是对请求响应的控制。Ajax允许中止请求通过xhr.abort(),而Fetch需要使用AbortControllerAbortSignal来实现请求中止,这在某些场景下更为灵活但需要额外步骤。 第四是默认行为差异。例如,在Ajax中,如果请求的Content-Type未明确设置,可能会根据发送的数据类型自动处理,而Fetch默认不会发送或接收cookies,需要显式设置credentials: 'include'。此外,Ajax的同源策略跨域请求处理与Fetch的CORS机制也有所不同,Fetch对跨域请求的支持更严格,需要服务器正确配置CORS头。 兼容性也是一个重要因素。XMLHttpRequest被所有现代浏览器支持,兼容性较好,而Fetch在旧版浏览器(如IE)中不被支持,可能需要polyfill。此外,Fetch返回的Promise在某些情况下可能需要使用async/await来更好地处理异步流程,而Ajax则依赖于回调函数。 性能方面,Fetch基于Promise,可以利用现代JavaScript的异步特性,而Ajax的回调方式可能在复杂流程中导致回调地狱。另外,Fetch的流式处理响应体在某些高级应用中可能更有优势,但常规使用中差异不大。 总结时,我需要强调两者的优缺点适用场景。Ajax适合需要广泛兼容性或需要更细粒度控制的情况,而Fetch适合现代浏览器环境,追求更简洁的代码Promise的便利性。同时,可以提到Axios这样的第三方库如何结合两者的优点,比如基于Promise的API更全面的功能支持。 在整理这些点时,需要确保逻辑清晰,分点说明,避免混淆。同时,需要检查是否有遗漏的重要区别,例如是否支持超时设置、上传进度监控等。例如,Ajax可以通过xhr.timeout设置超时,而Fetch需要使用AbortController结合setTimeout来实现超时,或者使用第三方库。上传进度监控在Ajax中可以通过xhr.upload.onprogress事件实现,而Fetch目前没有原生支持,可能需要其他方法。 最后,给出使用建议,帮助用户根据项目需求选择合适的技术。比如,如果项目需要支持旧版浏览器,Ajax或Axios可能更合适;如果是现代应用,Fetch或Axios会是更好的选择,因为Fetch的语法更现代,而Axios提供了更多便利功能。</think>Ajax(基于 `XMLHttpRequest`) `Fetch API` 是现代 JavaScript 中实现异步请求的两种主要方式,以下是它们的核心区别: --- ### 一、语法与代码结构 | **特性** | **Ajax (XMLHttpRequest)** | **Fetch API** | |------------------|---------------------------------------|----------------------------------------| | **基本语法** | 回调函数模式,代码冗长 | 基于 Promise,链式调用更简洁 | | **示例** | ```javascript const xhr = new XMLHttpRequest(); xhr.open('GET', '/api/data'); xhr.onload = function() { if (xhr.status === 200) { console.log(xhr.response); } }; xhr.send(); ``` | ```javascript fetch('/api/data') .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error(error)); ``` | --- ### 二、错误处理机制 | **特性** | **Ajax** | **Fetch** | |------------------|---------------------------------------|----------------------------------------| | **HTTP 错误** | 不自动视为错误,需手动检查状态码 | 不拒绝 Promise,需通过 `response.ok` 判断 | | **网络错误** | 触发 `onerror` 事件 | 拒绝 Promise | | **示例** | ```javascript xhr.onerror = function() { console.error('请求失败'); }; ``` | ```javascript fetch('/api/data') .then(response => { if (!response.ok) { throw new Error('HTTP 错误'); } return response.json(); }); ``` | --- ### 三、功能与控制能力 | **特性** | **Ajax** | **Fetch** | |--------------------|---------------------------------------|----------------------------------------| | **请求中止** | 支持 `xhr.abort()` | 需通过 `AbortController` 实现 | | **超时设置** | 直接通过 `xhr.timeout` 属性 | 需结合 `AbortController` `setTimeout` | | **进度监控** | 支持上传/下载进度(`xhr.upload.onprogress`) | 原生不支持,需扩展实现 | | **跨域 Cookie** | 默认携带(同源) | 需设置 `credentials: 'include'` | --- ### 四、兼容性与现代性 | **特性** | **Ajax** | **Fetch** | |------------------|---------------------------------------|----------------------------------------| | **浏览器支持** | 所有主流浏览器(包括旧版 IE) | 现代浏览器(不支持 IE) | | **Promise 支持** | 需手动封装 | 原生基于 Promise | | **Stream 处理** | 不支持 | 支持流式读取响应体(如 `response.body`) | --- ### 五、推荐使用场景 1. **选择 Ajax (XMLHttpRequest)** - 需要兼容旧版浏览器(如 IE11) - 需要监控上传/下载进度 - 需要更简单的超时控制 2. **选择 Fetch API** - 现代浏览器环境 - 需要更简洁的语法 Promise 链式调用 - 需要流式数据处理或更灵活的请求控制 3. **第三方库推荐(如 Axios)** - 结合了两者优点:基于 Promise、自动转换 JSON、支持拦截器、浏览器/Node.js 通用 ```javascript axios.get('/api/data') .then(response => console.log(response.data)) .catch(error => console.error(error)); ``` --- ### 总结 - **Ajax** 是传统方案,功能全面但代码冗余,兼容性好。 - **Fetch** 是现代方案,语法简洁但需注意错误处理兼容性。 - 根据项目需求选择:优先使用 `Fetch`(现代应用)或 `Axios`(功能全面),必要时回退到 `Ajax`。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值