扩展:利用fetch发送网络请求

目录

参考博客

1.一些概念 

XHR(XMLHttpRequest)是一个浏览器接口,使得Javascript可以进行HTTP(S)通信。
因为它太有用,其他浏览器也模仿部署了,ajax操作因此得以诞生。
AJAX(Asynchronous JavaScript),意思是:XML 异步的 JavaScript 和 XML。
ajax是基于浏览器提供的XMLHttpRequest对象来实现的。
自从有了ajax之后,我们就可以实现异步的加载网页。

XML(eXtensible Markup Language)指可扩展标记语言。
我们在浏览器中使用XMLHTTPRequest对象在服务器之间通信,传输的数据是使用XML的方式,但最终还是会被转换成json数据格式来被我们使用。

jQuery和axios都是对XML的封装,都是为了更方便地用XML。
但是,我们不用XML,用fetch也可以发网络请求,它解决了XML的一些缺陷,比如XML不符合关注分离(Separation of Concerns)的原则。
所谓关注分离,其实就是将问题进行分解。

2.代码举例

使用 XHR 发送一个 json 请求一般是这样

var xhr = new XMLHttpRequest();
xhr.open('GET', url);      //启动一个请求以备发送
xhr.responseType = 'json'; //指定响应的数据类型
//onload是回调函数,异步请求加载完成,并且readyState变为4后执行
xhr.onload = function() {
  console.log(xhr.response);
};
//ajax也是回调函数,在ajax请求出错后执行
xhr.onerror = function() {
  console.log("Oops, error");
};
xhr.send();               //发送特定的请求

使用 fetch 后,顿时看起来好一点(这里体会一下关注分离:先判断有没有联系上服务器)

fetch(url).then(function(response) {
  return response.json(); //首先判断能不能联系上服务器,可以就返回一个promise实例response.json()
}).then(function(data) {
  console.log(data);          //获取数据成功
}).catch(function(e) {
  console.log("Oops, error"); //获取数据失败
});

使用 ES6 的箭头函数之后:

fetch(url).then(response => response.json())
  .then(data => console.log(data))
  .catch(e => console.log("Oops, error", e))

使用 async/await (属于 ES7)做最终优化

try {
  let response = await fetch(url);   //首先判断能不能联系上服务器
  let data = await response.json();  //再判断能不能获取数据
  console.log(data);
} catch(e) {
  console.log("Oops, error", e);
}
// 注:这段代码如果想运行,外面需要包一个 async function

3.改造案例:github用户搜索框

在此案例基础上改

其余文件不变 

/src/components/Search/index.jsx

import React, { Component } from 'react'
import PubSub from 'pubsub-js'

export default class Search extends Component {
  search = async ()=>{
    const {keyWordElement:{value:keyWord}} = this  //获取用户的输入内容
    //发送请求前通知List更新状态
    PubSub.publish('updateState',{isFirst:false,isLoading:true})
    //使用fetch发送网络请求
    try {
      const response = await fetch(`http://api.github.com/search/users?q=${keyWord}`)
      const data = await response.json()
      PubSub.publish('updateState',{isLoading:false,users:data.items})
    } catch(error) {
      PubSub.publish('updateState',{isLoading:false,err:error.message})
    }
  }
  render() {
    return (
      <section className="jumbotron">
        <h3 className="jumbotron-heading">Search Github Users</h3>
        <div>
          <input ref={c => this.keyWordElement = c} type="text" placeholder="enter the name you search"/>&nbsp;
          <button onClick={this.search}>Search</button>
        </div>
      </section>
    )
  }
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漂流の少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值