Fetch API  提供了一个 JavaScript接口,用于访问和操纵HTTP管道的部分,例如请求和响应。它还提供了一个全局fetch()方法,该方法提供了一种简单,合乎逻辑的方式来跨网络异步获取资源。

1.fetch()返回Promise对象

一般情况下返回一个已经resolve的Promise对象,只有在网络故障。或则请求被阻止时才会是reject状态的Promise。所以说返回404,500等也会返回resolve状态的Promise。

而resolve的是一个Response对象(Response是Promise对象resolve的结果)。

a)语法:

  fetch(input[,init]);

  input:定义要获取的资源,一般情况会写请求的地址

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

    method: 请求方式:get或post

    headers:请求头信息

    一般设置方式:

    

  1. const default= {
  2.   credentials: 'include',
  3. };
  4.  
  5. newOptions.headers = {
  6. Accept: 'application/json',
  7. 'Content-Type': 'application/json; charset=utf-8',
  8. ...default,
  9. }

    mod : 请求的模式,如 cors、 no-cors 或者 same-origin。

    credentials: 此方式为设置是否发送Cookie,omit不发送,same-origin,同源的才发送,include不管是否同源都会发送cookie
    body:  请求参数,一般情况使用JSON.stringify({参数对象})。
 b) Response对象

  属性:

    status 状态码,eg:200

    ok 返回一个boolean代表成功还是失败

  方法:

    Response实现了Body故而可以使用以下方法:

    json()    读取Response对象,并返回一个解析为json格式的Promise对象。之前看这里有点绕,后来才发现Promise对象可以resolve另外一个Promise对象 

  1. let promise1 = new Promise((resolve,reject)=>{
  2. setTimeout(()=>{
  3. resolve("promise1")
  4. },3000)
  5. })
  6.  
  7. //先打印出promise2,3秒后打印出promise1
  8. let promise2 = new Promise((resolve,reject)=>{
  9. resolve(promise1);
  10. console.log("promise2");
  11. }).then((res)=>{
  12. console.log(res); //三秒后打印出promise1
  13. })

使用fetch请求资源:

mork.json

  1. {
  2. "name":"张三丰",
  3. "age":"20",
  4. "gender":"男"
  5. }

index.js

  1. fetch("./mork.json").then(response=>{
  2. console.log(response);
  3. if(response.status===200){
  4. return response.json();
  5. }
  6. }).then(response=>{
  7. console.log(response);
  8. })

结果:

   后面的就好理解了

    text()  返回一个被解析为USVString格式的promise对象。

    formData()  返回一个被解析为FormData格式的promise对象

    blob()  返回一个被解析为Blob格式的promise对象

 

有些属性和方法可能用的也不是很多,确实要用的话可以再查文档。


说到Promise又不得不提到异步函数 async function

  异步函数返回的也是Promise对象,并且在异步函数中可以使用await

  await操作符是用来等待一个Promise对象,并且只能在async function使用。

  async function 返回值隐式的传递给Promise.resolve

  1. //定义一个Promise供异步函数中await使用
  2. let promise = new Promise((resolve,reject)=>{
  3. setTimeout(()=>{
  4. resolve("hello world")
  5. },3000)
  6. }).then((data)=>{ //为了测试await是不是等待的最后结果加了then
  7. return data.split("");
  8. })
  9.  
  10. async function test(params) {
  11. let res = await promise;
  12. return res;
  13. }
  14.  
  15. //async function 返回的是异步对象,所以可以继续用then处理
  16. test().then((data)=>{
  17. console.log(data);
  18. })

如何使用fetch的更多相关文章

  1. Git 少用 Pull 多用 Fetch 和 Merge

    本文有点长而且有点乱,但就像Mark Twain Blaise Pascal的笑话里说的那样:我没有时间让它更短些.在Git的邮件列表里有很多关于本文的讨论,我会尽量把其中相关的观点列在下面. 我最常 ...

  2. git提示:Fatal:could not fetch refs from ....

    在git服务器上新建项目提示: Fatal:could not fetch refs from git..... 百度搜索毫无头绪,最后FQgoogle,找到这篇文章http://www.voidcn ...

  3. sublime 插件推荐: Nettuts+ Fetch

    Nettuts+ Fetch github地址:Nettuts-Fetch 在sublime中直接用 ctrl+shift+P -> pci -> Nettuts-Fetch 即可下载 这 ...

  4. git pull和git fetch的区别

    Git中从远程的分支获取最新的版本到本地有这样2个命令:1. git fetch:相当于是从远程获取最新版本到本地,不会自动merge Git fetch origin master git log ...

  5. Hibernate之加载策略(延迟加载与即时加载)和抓取策略(fetch)

    假设现在有Book和Category两张表,表的关系为双向的一对多,表结构如下: 假设现在我想查询id为2的那本书的书名,使用session.get(...)方法: Session session=H ...

  6. SQL Server 2012提供的OFFSET/FETCH NEXT与Row_Number()对比测试(转)

    原文地址:http://www.cnblogs.com/downmoon/archive/2012/04/19/2456451.html 在<SQL Server 2012服务端使用OFFSET ...

  7. Attempt to fetch logical page (...) in database 2 failed. It belongs to allocation unit xxxx not to xxx

    今天一个同事说在一个生产库执行某个存储过程,遇到了错误: Fatal error 605 occurred at jul 29 2014 我试着执行该存储过程,结果出现下面错误,每次执行该存储过程,得 ...

  8. Fetch:下一代 Ajax 技术

    Ajax,2005年诞生的技术,至今已持续了 10 年.它是一种在客户端创建一个异步请求的技术,本质上它不算创新,是一组技术的组合.它的核心对象是 XMLHttpRequest. 简单回顾下历史 19 ...

  9. 在 JS 中使用 fetch 更加高效地进行网络请求

    在前端快速发展地过程中,为了契合更好的设计模式,产生了 fetch 框架,此文将简要介绍下 fetch 的基本使用. 我的源博客地址:http://blog.parryqiu.com/2016/03/ ...

  10. 解决:error: Cannot fetch repo (TypeError: expected string or buffer)

    同步源码,问题重现: Fetching project platform/external/libopus Fetching project repo error: Cannot fetch repo ...

随机推荐

  1. jq 获取表单所有数据

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  2. .NET 解决方案 核心库整理

    一系列令人敬畏的.NET核心库,工具,框架和软件: https://www.cnblogs.com/weifeng123/p/11039345.html 企业级解决方案收录:  https://www ...

  3. BZOJ 4259: 残缺的字符串 FFT_多项式

    Code: #include<bits/stdc++.h> #define maxn 1200000 using namespace std; void setIO(string s) { ...

  4. Codeforces Round #548 (Div. 2) A. Even Substrings

    You are given a string 

  5. [luogu2414 NOI2011]阿狸的打字机 (AC自动机)

    传送门 Solution 我们知道AC自动机上如果有一点A的fail[A]->B那么B为A的一个后缀 那么我们的问题\((x,y)\)就变为在y中有多少个点直接或间接连向x的终止节点 如果写暴力 ...

  6. Luogu P1198 BZOJ 1012 最大数 (线段树)

    手动博客搬家: 本文发表于20170821 14:32:05, 原地址https://blog.csdn.net/suncongbo/article/details/77449455 URL: (Lu ...

  7. QT中tableview不能更新数据,why?

    model->select(); //model->removeColumn(0);++++++++++++++++++++ //model->setHeaderData(model ...

  8. lucene_09_solrj的使用

    什么是solrj solrj 是访问Solr 服务的java客户端,提供索引(增删改)和搜索(查)的请求方法,Solrj 通常在嵌入在业务系统中,通过Solrj的API接口操作Solr服务,如下图: ...

  9. windows 2003一个网卡绑定多个IP地址

    1.打开“网络连接”,选中需要添加多个IP的“本地连接”-->右键-->“属性”: 2.从“常规”中找到“Internet 协议(TCP/IP)属性”: 3.选择手动设置IP地址.网关.掩 ...

  10. 怎么样调整FreeBSD时区问题

    一般我们在安装系统的时候,都会遇到服务器时间不同步的情况.所以必须得设置为中国时区,比较简单的方法,就总结如下几点: 1.通过命令行启动图形界面更改 #sysinstall 请选择 configure ...