在使用 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 回调的使用方法。 有问题评论见。。