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.jb51.net/201707/yuanma/js-fetch(jb51.net).rar

总结

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

(0)

相关推荐

  • JavaScript 用fetch 实现异步下载文件功能

    废话不多说了,直接给大家贴代码了,具体代码如下所示: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>sample</title> </head> <body> <button id='btn'>下载</button> <span id='status'></span> &

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

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

  • 微信小程序利用co处理异步流程的方法教程

    本文主要介绍的是关于微信小程序利用co处理异步流程的方法教程,分享出来供大家参考学习,需要的朋友们下面来看看详细的介绍: co co是一个基于ES6 Generator特性实现的[异步流程同步化]写法的工具库. co需要使用Promise特性,所以,我们先来创建一个使用Promise来处理的异步方法: function myAsyncFunc() { return new Promise(function (resolve, reject) { setTimeout(function () {

  • jquery捕捉回车键及获取checkbox值与异步请求的方法

    本文实例讲述了jquery捕捉回车键及获取checkbox值与异步请求的方法.分享给大家供大家参考,具体如下: 1.jquery捕捉回车键: $("html").die().live("keydown",function(event){ if(event.keyCode==13){ //这里添加要处理的逻辑 } }); 2.jquery获得多个选中的checkbox值: $('input[type="checkbox"][name="t

  • vue-resourc发起异步请求的方法

    除了vue-resource之外,还可以使用'axios'的第三方包实现数据的请求因为跨域失败访问不到,不过同域的可以直接访问.html文件来检验,这样可以不用搭服务器建议使用axios来进行异步访问请求 1.安装或导入vue-resource 安装命令: npm install vue-resource 导入: import VueResource from 'vue-resource' Vue.use(VueResource) 2.使用 格式: this.http.get('/url',[o

  • 获取WebService的请求信息方法实例

    一个已经写好的项目中有多个WebService,由于之前没有记录请求信息的,有时候需要查错等需要找到当次的请求信息,所以需要加入记录请求信息的功能. 首先想到的是在每一个带有WebMethod特性的方法里调用记录请求信息的方法,这样可以记录信息,但是太多带WebMethod特性的方法了,于是想在全局中拦截并捕获,于是想到了Global.asax public class Global : System.Web.HttpApplication { protected void Applicatio

  • javascript带回调函数的异步脚本载入方法实例分析

    本文实例讲述了javascript带回调函数的异步脚本载入方法.分享给大家供大家参考.具体实现方法如下: var Loader = function () { } Loader.prototype = { require: function (scripts, callback) { this.loadCount = 0; this.totalRequired = scripts.length; this.callback = callback; for (var i = 0; i < scri

  • iOS应用中发送HTTP的get请求以及HTTP异步请求的方法

    Http get 请求 复制代码 代码如下: // 组合一个搜索字符串     NSString *urlStr = [NSString stringWithFormat:@"http://www.baidu.com/s?wd=%@", @"php"];     // 字符串转化为URL     NSURL *url = [NSURL URLWithString:urlStr];      //    NSMutableURLRequest *request = [

  • JavaScript异步操作的几种常见处理方法实例总结

    本文实例讲述了JavaScript异步操作的几种常见处理方法.分享给大家供大家参考,具体如下: 引言 js的异步操作,已经是一个老生常谈的话题,关于这个话题的文章随便google一下都可以看到一大堆.那么为什么我还要写这篇东西呢?在最近的工作中,为了编写一套相对比较复杂的插件,需要处理各种各样的异步操作.但是为了体积和兼容性,不打算引入任何的pollyfill,甚至连babel也不允许使用,这也意味着只能以es5的方式去处理.使用回调的方式对于解耦非常不利,于是找了别的方法去处理这个问题.问题是

  • JavaScript实现动态添加,删除行的方法实例详解

    本文实例讲述了JavaScript实现动态添加,删除行的方法.分享给大家供大家参考.具体如下: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>增加Table行</title> </head> <script language="javascript

随机推荐