全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

JavaScript利用fetch实现异步请求的方法实例

前言

相信大家应该都有所了解,在这个AJAX时代,如果想进行 API 等网络请求都是通过 XMLHttpRequest 或者封装后的框架进行网络请求。 现在产生的 fetch 框架简直就是为了提供更加强大、高效的网络请求而生,虽然在目前会有一点浏览器兼容的问题,但是当我们进行一些异步请求时,都可以使用 fetch 进行完美的网络请求。下面话不多说,来一起看看详细的介绍吧。

先来看看各个浏览器对fetch的原生支持情况,可以看到支持性并不是很高,safari在10.1 之后才支持,ios更是10.3之后才支持,IE完全不支持。当然新技术的发展总会经历这个过程。


Ajax请求

普通的Ajax请求,用XHR发送一个json请求一般是这样的:

var xhr = new XMLHttpRequest(); 
xhr.open("GET", url); 
xhr.responseType = 'json'; 
xhr.onload = function(){ 
 console.log(xhr.response); 
}; 
xhr.onerror = function(){ 
 console.log("error") 
} 
xhr.send();

使用fetch实现的方式:

fetch(url).then(function(response){ 
 return response.json(); 
}).then(function(data){ 
 console.log(data) 
}).catch(function(e){ 
 console.log("error") 
}) 

也可以用async/await的方式

try{ 
 let response = await fetch(url); 
 let data = await response.json(); 
 console.log(data); 
} catch(e){ 
 console.log("error") 
}

用了await后,写异步代码感觉像同步代码一样爽。await后面可以跟Promise对象,表示等待Promise resolve()才会继续下去执行,如果Promise被reject()或抛出异常则会被外面的try...catch捕获。

使用fetch

fetch的主要优点是

  • 语法简洁,更加语义化
  • 基于标准的Promise实现,支持async/await
  • 同构方便

但是也有它的不足

  • fetch请求默认是不带cookie的,需要设置fetch(url, {credentials: 'include'})
  • 服务器返回400,500这样的错误码时不会reject,只有网络错误这些导致请求不能完成时,fetch才会被reject.

fetch语法:

fetch(url, options).then(function(response) { 
 // handle HTTP response 
}, function(error) { 
 // handle network error 
})

具体参数案例:

//兼容包 
require('babel-polyfill') 
require('es6-promise').polyfill() 
 
import 'whatwg-fetch' 
 
fetch(url, { 
 method: "POST", 
 body: JSON.stringify(data), 
 headers: { 
 "Content-Type": "application/json" 
 }, 
 credentials: "same-origin" 
}).then(function(response) { 
 response.status //=> number 100–599 
 response.statusText //=> String 
 response.headers //=> Headers 
 response.url //=> String 
 
 response.text().then(function(responseText) { ... }) 
}, function(error) { 
 error.message //=> String 
})

参数说明

url

定义要获取的资源。这可能是:一个 USVString 字符串,包含要获取资源的 URL。一个 Request 对象。

options(可选)

一个配置项对象,包括所有对请求的设置。可选的参数有:

  • method: 请求使用的方法,如 GET、POST。
  • headers: 请求的头信息,形式为 Headers 对象或 ByteString。
  • body: 请求的 body 信息:可能是一个 Blob、BufferSource、FormData、URLSearchParams 或者 USVString 对象。注意 GET 或 HEAD 方法的请求不能包含 body 信息。
  • mode: 请求的模式,如 cors、 no-cors 或者 same-origin。
  • credentials: 请求的 credentials,如 omit、same-origin 或者 include。
  • cache: 请求的 cache 模式: default, no-store, reload, no-cache, force-cache, 或者 only-if-cached。

response

一个 Promise,resolve 时回传 Response 对象:

属性:

  • status (number) - HTTP请求结果参数,在100–599 范围
  • statusText (String) - 服务器返回的状态报告
  • ok (boolean) - 如果返回200表示请求成功则为true
  • headers (Headers) - 返回头部信息,下面详细介绍
  • url (String) - 请求的地址

方法:

  • text() - 以string的形式生成请求text
  • json() - 生成JSON.parse(responseText)的结果
  • blob() - 生成一个Blob
  • arrayBuffer() - 生成一个ArrayBuffer
  • formData() - 生成格式化的数据,可用于其他的请求

其他方法:

  • clone()
  • Response.error()
  • Response.redirect()
  • response.headers
  • has(name) (boolean) - 判断是否存在该信息头
  • get(name) (String) - 获取信息头的数据
  • getAll(name) (Array) - 获取所有头部数据
  • set(name, value) - 设置信息头的参数
  • append(name, value) - 添加header的内容
  • delete(name) - 删除header的信息
  • forEach(function(value, name){ ... }, [thisContext]) - 循环读取header的信息

使用实例

//获取css里ul的id属性 
let uldom = document.getElementById("students"); 
//单独创建一个json文件,获取地址 
let url = "data.json"; 
 
function main(){ 
 fetch(url).then(respone=>{ 
 return respone.json(); 
 }).then(students=>{ 
 
 let html = ``; 
 for(let i=0, l=students.length; i<l; i++){ 
  let name = students[i].name; 
  let age = students[i].age; 
  html += ` 
  <li>姓名:${name},年龄:${age}</li> 
  ` 
 } 
 
 uldom.innerHTML = html; 
 }); 
} 
 
main();

结合await最终代码

let uldom = document.getElementById("students"); 
let url = "data.json"; 
 
async function main(){ 
 let respone = await fetch(url); 
 let students = await respone.json(); 
 
let html =``; 
for(let i=0, l=students.length; i<l; i++){ 
 let name = students[i].name; 
 let age = students[i].age; 
 html += ` 
 <li>姓名:${name},年龄:${age}</li> 
` 
} 
uldom.innerHTML = html; 
} 
main();

data.json文件内容如下:

[ 
 {"name":"张三","age":"3"}, 
 {"name":"李万","age":"1"}, 
 {"name":"王二","age":"4"}, 
 {"name":"二狗","age":"3"}, 
 {"name":"狗蛋","age":"5"}, 
 {"name":"牛娃","age":"7"} 
]

运行后结果是:

姓名:张三,年龄:3 
姓名:李万,年龄:1 
姓名:王二,年龄:4 
姓名:二狗,年龄:3 
姓名:狗蛋,年龄:5 
姓名:牛娃,年龄:7

源码下载

下载地址:http://xiazai./201707/yuanma/js-fetch().rar

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。


# fetch异步请求  # javascript  # fetch  # 异步请求  # JavaScript使用Fetch的方法详解  # JavaScript 用fetch 实现异步下载文件功能  # javascript实现fetch请求返回的统一拦截  # JavaScript中fetch方法的使用示例全面详解  # js fetch异步请求使用实例详解  # JavaScript fetch接口案例解析  # JS中fetch()用法实例详解  # 一文详解JavaScript中的fetch方法  # 才会  # 可选  # 后才  # 都是  # 是一个  # 王二  # 也有  # 会有  # 在这个  # 下载地址  # 是这样  # 可以用  # 其他的  # 很高  # 用了  # 可以看到  # 总会  # 详细介绍  # 不支持  # 可以使用 


相关文章: 如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  如何续费美橙建站之星域名及服务?  怀化网站制作公司,怀化新生儿上户网上办理流程?  建站之星展会模版如何一键下载生成?  建站之星安装步骤有哪些常见问题?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  如何用VPS主机快速搭建个人网站?  常州企业建站如何选择最佳模板?  行程制作网站有哪些,第三方机票电子行程单怎么开?  如何规划企业建站流程的关键步骤?  ,怎么用自己头像做动态表情包?  C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换  长沙企业网站制作哪家好,长沙水业集团官方网站?  C++时间戳转换成日期时间的步骤和示例代码  制作公司内部网站有哪些,内网如何建网站?  C#如何使用XPathNavigator高效查询XML  家具网站制作软件,家具厂怎么跑业务?  在线教育网站制作平台,山西立德教育官网?  头像制作网站在线制作软件,dw网页背景图像怎么设置?  打鱼网站制作软件,波克捕鱼官方号怎么注册?  如何用虚拟主机快速搭建网站?详细步骤解析  西安大型网站制作公司,西安招聘网站最好的是哪个?  内部网站制作流程,如何建立公司内部网站?  网站设计制作企业有哪些,抖音官网主页怎么设置?  网站制作企业,网站的banner和导航栏是指什么?  大学网站设计制作软件有哪些,如何将网站制作成自己app?  创业网站制作流程,创业网站可靠吗?  建站主机如何安装配置?新手必看操作指南  微信小程序制作网站有哪些,微信小程序需要做网站吗?  电脑免费海报制作网站推荐,招聘海报哪个网站多?  广州商城建站系统开发成本与周期如何控制?  专业商城网站制作公司有哪些,pi商城官网是哪个?  如何在阿里云通过域名搭建网站?  公司门户网站制作流程,华为官网怎么做?  太原网站制作公司有哪些,网约车营运证查询官网?  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  装修招标网站设计制作流程,装修招标流程?  javascript中的try catch异常捕获机制用法分析  如何注册花生壳免费域名并搭建个人网站?  如何在香港服务器上快速搭建免备案网站?  如何在建站宝盒中设置产品搜索功能?  网站制作公司排行榜,四大门户网站排名?  如何设置并定期更换建站之星安全管理员密码?  如何在香港免费服务器上快速搭建网站?  如何在IIS中新建站点并配置端口与IP地址?  建站主机默认首页配置指南:核心功能与访问路径优化  C++如何编写函数模板?(泛型编程入门)  如何实现建站之星域名转发设置?  如何制作一个表白网站视频,关于勇敢表白的小标题?  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。