使用fetch 遇到的ReadableStream is locked 的问题

在使用 fetch进行封装的时候,我遇到一个问题,就是要同时兼容后台返回的数据节后也不一样的问题

比如有时候是json,有时候是string,有时候是Buffer类型。等等,看代码

let a = null;
fetch(url).then(
  res=> {
return res.json()
}.catch(
  e=>{
  return res.arrayBuffer()
  }
))

这种情况是这样的,先去做json的处理。如果不是json 会进入到catch但是这个时候 catch里面的e不是你要的数据,所以在

then回调里面对变量进行了赋值。这下就兼容了两个数据类型。

要注意的是 一定要把json放在最上面,readablestream可以被任意调用arrayBuffer方法 而不会进入catch方法。如果你还要兼容其他的,可以继续在catch上面加

此时问题来了,

会遇到函数报 ReadableStream is locked 的错误

是因为这个对象可能只能调用一次api就会被lock,解决办法是 调用他的clone方法 如下

let a = null;
let data = await fetch(url).then(
  res=> {
a = res.clone().arrayBuffer()
return res.clone().json() }.catch(   e=>{   return a   } ))

可能还会有其他的办法。注意哦。如果你要兼容多种数据类型。catch 回调的使用方法。 有问题评论见。。

原文地址:https://www.cnblogs.com/lisiyang/p/11429906.html