ReactNative网络请求之Fetch

2018-01-22  本文已影响0人  开团先打辅助

注意:网上的各种关于fetch的API已经更多,本文不做过多解释,本文重点解决新手第一次使用fetch遇到的困惑

现阶段市场上的各种Ajax请求库琳琅满目,不论是vue1.0的vue—resource还是vue2.0的axios都是基于promise对象封装的Ajax库,类似如下结构:

xxx(url)

.then(成功语句)

.catch(错误处理)

而ReactNative也有自己的Ajax请求库fetch,fetch并不是RN所独,官方只是采用了fetch并且把他封装成全局方法,所以用的时候并不需要额外引用,直接使用即可。首先来看一下fetch的结构:

fetch(url)

.then(res=> res.json())

.then(data => console.log(data))

.catch(e => console.log("Oops, error", e))

1.为什么多了一个.then(res=> res.json())

说好的then(成功),catch(失败)呢,为什么多出一个then?首先要明确前后端通信永远都是以字符串string来进行的,所以前台发送给后台的json数据都需要使用JSON.stringify来转换成字符串,而后台发送过来的json字符串"{retcode:'ok',data:{a:1}}"都需要使用eval或者JSON.parse()来转换成json才能使用data.a,那么很多时候我们为什么没有这么做呢,因为很多Ajax库已经自动做完了这一步,例如jQuery的Ajax就不需要,因为他已经自动帮你把传过来的字符串转化成json了。所以fetch中的res.json()的json()和JSON.parse()是同一个东西,只是他封装成json()这个方法而已。

既然如此为何fetch不像jQuery哪有把这一步自动执行,还需要我们每次多写一句res.json()呢?

由于众所周知的原因在开发RN的时候我们无法在浏览器中的network中看到Ajax请求详情,这是因为App的打包和运行机制造成的,那么问题来了,假如我们和后台交互的过程中出现错误,去哪里看错误信息?这时候我们就可以去res.json()之前去打印信息,因为这里面是未经过任何处理的字符串,可以一眼看出问题的所在:

fetch(url)

.then(res=>{

console.log(res)//未经过处理的string

res.json()

})

.then(data => console.log(data))

.catch(e => console.log("Oops, error", e))

所以每次都要写多写一次json()不是闲着没事干,而是大有用处的

2.如何使用fetch进行同步请求

对不起,fetch天生就是异步请求,不存在同步请求。那么如果我们有一个同步需求怎么办,例如我微信发朋友圈有两个过程:1上传图片成功后拿到后台返回的图片地址,2将后台的返回的地址和写的文字一起保存在数据库。这就是一个同步需求,必须先上传图片再保存数据,终极大招:只能利用js从上而下阻塞式解析来解决了,把postData放在uploadImage的成功回调函数里面不就行了吗

uploadImage:

fetch(url)

.then(res=> res.json())

.then(data => {

  _this.postData(data)

})

.catch(e => console.log("Oops, error", e))

上一篇下一篇

猜你喜欢

热点阅读