fetch的使用--当无法判断后台返回数据为什么类型时如何操作

需求:一个增删改查页面,当新增,删除或者修改操作时不确定后台会返回的信息(会根据需求不同请求成功后可能返回message,可能什么都不返回)

问题:使用fetch进行请求时, Fetch API 的 Response 接口呈现了对一次请求的响应数据,response解析数据的方法我用到的为response.json()和response.text(),因为response可以获取到状态码,请求状态,但是在解析之前是不清楚返回到结果用哪种方式解析的,如果后台返回的为空还用json的方式就会报错   "Unexpected end of JSON input"

解决:

在fetch请求后使用了三个then去处理各种状态的返回值:

  1)第一个then判断是否请求成功,失败则直接返回错误信息

  2)成功则在第二个then中判断mothed类型,若为增删改状态则返回response.text(),其他类型返回response.json()

  3)第三个then接收第二个then的返回值,若mothed类型为增删改则判断后台是否返回了message,返回则进行解析并渲染出返回值,若无返回值则不进行操作,其他类型则直接返回第二个then中的返回值

const checkStatus = response => { //当请求成功时直接返回response,失败则进行json解析返回失败信息
  if (response.status == 200) {
    return response
  }else{
    return response.json().then(json => {
      return Promise.reject(json)
    })
  }
};

export default function basicRequest(url, option) {

  const options = {

  expirys: isAntdPro(),

    ...option,

  };

  const fingerprint = url + (options.body ? JSON.stringify(options.body) : ‘‘);

  const hashcode = hash

    .sha256()

    .update(fingerprint)

    .digest(‘hex‘);

  const defaultOptions = {

    credentials: ‘include‘,

  };

  const newOptions = { ...defaultOptions, ...options };

  if (

    newOptions.method === ‘POST‘ ||

    newOptions.method === ‘PUT‘ ||

    newOptions.method === ‘DELETE‘ ||

    newOptions.method === ‘PATCH‘

  ) {

    if (!(newOptions.body instanceof FormData)) {

      newOptions.headers = {

        Accept: ‘application/json‘,

        ‘Content-Type‘: ‘application/json; charset=utf-8‘,

        ...newOptions.headers,

      };

      newOptions.body = JSON.stringify(newOptions.body);

    } else {

      newOptions.headers = {

        Accept: ‘application/json‘,

        ...newOptions.headers,

      };

    }

  }

  const expirys = options.expirys && 60;

  if (options.expirys !== false) {

    const cached = sessionStorage.getItem(hashcode);

    const whenCached = sessionStorage.getItem(`${hashcode}:timestamp`);

    if (cached !== null && whenCached !== null) {

      const age = (Date.now() - whenCached) / 1000;

      if (age < expirys) {

        const response = new Response(new Blob([cached]));

        return response.json();

      }

      sessionStorage.removeItem(hashcode);

      sessionStorage.removeItem(`${hashcode}:timestamp`);

    }

  }

return fetch(url, newOptions)
    .then(checkStatus)
    .then(response => {    //请求成功状态下,method正常情况使用response.json()将结果返回,当进行增删改时使用response.text(),在返回值为空或者有返回值是text()都不会报错
      if (newOptions.method === ‘DELETE‘||
          newOptions.method === ‘POST‘||
          newOptions.method === ‘PATCH‘||
          newOptions.method === ‘PUT‘) {
        return response.text();
      }
      return response.json();
    }).then(e=>{    //获取上一步返回的值,当method非增删改状态直接返回值,反之判断返回值是否存在,若存在解析一下弹出信息,若不存在不做操作
      if (newOptions.method === ‘DELETE‘||
          newOptions.method === ‘POST‘||
          newOptions.method === ‘PATCH‘||
          newOptions.method === ‘PUT‘) {
            if(e){
              const msg = JSON.parse(e)
              if(msg.message){
                notification.success({
                  message: msg.message
                })
              }
            }
      }
      return e
    })
    .catch(e => {//获取错误信息并弹出
      notification.error({
        message: e.message
      })
    })}

首发于 博客园

原文地址:https://www.cnblogs.com/yunyea/p/10827072.html

时间: 2024-10-24 02:15:40

fetch的使用--当无法判断后台返回数据为什么类型时如何操作的相关文章

后台返回数据事null时怎么进行判断

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545; min-height: 14.0px } span.s1 { font: 12.0px ".PingFang

addScalar 显式指定返回数据的类型

sql: select a.id as 受理 from a SQLQuery sqlQuery=this.getSession().createSQLQuery(sb.toString()).addScalar("appId",Hibernate.STRING).addScalar("受理",Hibernate.INTEGER); 注:一旦使用addScalar,所有的属性都得用上. addScalar 显式指定返回数据的类型

后台返回数据为map集合,前端js处理方法

当后台返回的数据不是json而是map集合的时候,前端js中处理就将其看作是一个数组,例如后台返回的代码入下: Map<String, String> result = new HashMap<String, String>(); map.put("code", "200"); map.put("title", result.get("title")); map.put("content&qu

如何把后台返回数据的根据某个选项去重新排序?

比如:一个用户列表要按照用户的积分高低去排序渲染(一般后台会排序之后返回给你); 例如下面的data是请求回来的数据, var data={ "ret_code": "0", "ret_msg": "ok", "data": { "users": [ { "pfid": 1000011, "nickname": "cabbageancy&

前端模拟后台返回数据之Mockjs

一.官方文档: https://github.com/nuysoft/Mock/wiki/Syntax-Specification 二.极限前端实例: http://jixianqianduan.com/frontend-javascript/2015/09/20/mockjs.html

怎么解析后台返回数据中\r\n换行

? 给div添加css样式, white-space: pre-wrap; 即可 ? 文章来源:刘俊涛的博客 欢迎关注公众号.留言.评论,一起学习. __________________________________________________________________________________ 若有帮助到您,欢迎捐赠支持,您的支持是对我坚持最好的肯定(*^_^*) 原文地址:https://www.cnblogs.com/lovebing/p/12332809.html

在用UEditor往后台传数据写入数据库时,出现错误:从客户端(NewsContent=&quot;&lt;p&gt;&lt;img src=&quot;http://...&quot;)中检测到有潜在危险的 Request.。。。

解决办法: 把传数据的方式换了一下,加上 [ValidateInput(false)]就不报错了. 建议看看这个:http://www.360doc.com/content/10/0521/15/466494_28756529.shtml 觉得写得很好.

后台返回为字符串null时,变成空字符串

+ (NSString *)noNullStringWith:(id)dataString { NSString *nullString = dataString; if ([nullString isKindOfClass:[NSString class]] && nullString.length) { return nullString; } else { return @""; } } 原文地址:https://www.cnblogs.com/Gaiayueyu

直接在安装了redis的Linux机器上操作redis数据存储类型--对Sorted-Sets操作

一.概述: Sorted-Sets和Sets类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中.它们之间的主要差别是Sorted-Sets中的每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序.然而需要额外指出的是,尽管Sorted-Sets中的成员必须是唯一的,但是分数(score)却是可以重复的. 在Sorted-Set中添加.删除或更新一个成员都是非常快速的操作,其时间复杂度为集合中成员数量的对数.由于Sorted