乐趣区

ES6之fetch

js 原生支持,比 XHR 强大,易用的数据交互对象。

fetch 的两个步骤

基本使用

fetch("url").then(res=>{},err=>{});

Response(res)对象成员

  • ok: 是否成功
  • headers: 响应头对象
  • status/statusText: 状态码 / 状态文本
  • redirected: 是否重定向过
    fetch('../public/info.text').then(res => {console.log('res info is:',res);
       const {ok} = res;
       if(ok){console.log('request ok!')
       }else{console.log('request error');
       }
    },(err)=>{
        // 网络错误、连接失败、无法解析对方数据
        console.log('request error');
    })

运行结果:

可以看到 fetch 的第一个 then 里面成功的回调响应对象的一些信息,哎,仔细观察,发现并没有我们真正需要的数据啊,这是怎么肥事儿?其实呢,对于 fetch 来说,第一个 then,res 回调函数中响应对象 res 里面有一个 json()方法,该返回返回一个 promise 对象,在这个对象的 then 回调里面就是我们真正需要的数据了。

fetch('../public/info.json').then(res=>res.json(),err=>{console.log(err)
}).then(data=>{console.log('data is:',data)
},err1=>{console.log(err1)
})


res 对象的几个方法:

  • json():json 方式解析数据 —— 适合:一般数据
  • arrayBuffer(): 把数据解析成二进制数组
  • blob(): 不解析,原始二进制数据 —– 适合:图片、视频、音频等
  • fromData(): 以表单方式解析数据
  • text(): 以文本方式解析数据 —— 适合:文本内容

比较

方法 解释 用途
arrayBuffer 因为高级语言 (包括 JS) 都不擅长处理二进制数据,所以 arrayBuffer 是一种让 js 能读取二进制的对象,但一般情况下,处理二进制数据都是非常复杂的,所以极少使用 极少
bolb 性能较好,因为无需任何转换操作 图片、视频、音频
json 绝大部分数据文件都以 json 和数组的方式传输 数据
text 文本数据 文本、html

async 配合 fetch

(async () => {
   try {let res = await fetch('./info.json')
    let data =await res.json()
    console.log('data is:',data);
   } catch (error) {console.log(error)   
   }
})()

与 async 配合起来,从写法上看起来就比较简介,并且使用 try…catch… 对错误、异常进行处理

最终的结果也是以上面输出的一样:

headers 的操作

一般情况下,服务器端的响应头里面的信息,在实际开发中我们有时候也会获取来进行某些操作,那么使用 fetch 进行数据通信的适合,该怎样去获取响应头的信息呢?

以上图为例,要获取响应头里面的 Content-Type:

res.headers.get('Content-Type')

这就拿到了。获取其他响应头里包含的信息也是一样,调用 headers 对象的 get 方法,通过传入键,就可以获取到对应的值。

与 React 结合使用

import React from 'react';
import logo from './logo.svg';
import './App.css';
import {thisExpression} from '@babel/types';

class App extends React.Component{constructor(){super();
    this.state = {users:[],
      mIcon:''
    }
  }

  async componentDidMount(){let res = await fetch('./info.json')
    let users = await res.json();
    let res1 = await fetch('./mCat.jpg')
    let mBolb = await res1.blob();
    this.setState({
      users,
      mIcon:URL.createObjectURL(mBolb)
    })
  }

  render(){
    return(
      <div>
        <ul>
          {this.state.users.map((item,index)=>(<li key={index}>
                <div> 姓名:{item.name}</div>
                <div> 年龄:{item.age}</div>
                <img src={this.state.mIcon}/>
              </li>
            ))
          }
        </ul>
      </div>
    )
  }
}
export default App;
   
退出移动版