今晚在看Ajax ,看到了readystate ,关于其状态产生了一些看法,而这些看法与我在学习网络协议时
产生的想法不谋而合,那就是其实技术可以不要总是想的那么恐怖和困难。
XMLHttpRequest.readyState 返回的是XMLHttpRequest代理当前所属的状态,这些状态有:
看完这张图,我不经想起了曾经学过的TCP协议,当时我第一次碰到tcp的时候,那时我就在想为什么要三次握手,为什么握手
就是三次,想了很久不得其解,后来在知乎上看到一个大佬说过一个例子,让我茅塞顿开:
小明:小红,请问你在吗?
小红:我在呢,你能听到我说话吗?
小明:我可以听到你说话。
没错,就是这个比较常用的打电话例子,这个例子对于三次握手的解释的确是非常通俗易懂了,那为什么不是两次呢?
其实很简单,那就是网络其实没有我们想的那么聪明,如果两次握手,我们想想会不会产生这一种情况:
客户端A给服务器B发个包,请求服务器连接,但是网络突然卡了延迟了,于是服务器B没有收到客户端A的请求,
A就很纳闷了,哎呀,好家伙还不鸟我?于是又重传了一个请求包给服务器B,这次网络OK,服务器B收到了请求,然后回送一个“OK,没问题”,
然后双方就开始愉快的传递数据。 传递数据结束后,双方断开,这时候,浏览器A第一次发出的请求包突然间可以继续传了,然后又一次
发送给服务器,而此时服务器是识别不了的(没办法,老好人。你问我就给),然后服务器B又一次和浏览器A建立连接,又一次重复传递数据,
这样就浪费了资源了。
而如果是三次的话,即使是服务器B收到延迟的请求包,然后回复“OK,没问题”给浏览器A,浏览器A也会只是“郁闷????,这什么玩意”(毕竟已经发过请求了,这次的数据交互已经结束了),
所以浏览器A也就不会对这个回复进行确认,那么服务器B收不到确认,也就不会进行连接了。
那么为什么不是四次握手呢?(这不废话吗?三次能搞定的事非得四次浪费时间和资源)。
这个TCP和Ajax有什么关系呢? 其实,我举这个例子只是觉得,一直以来我们对一门语言,技术的看法是不是太过复杂,或者说畏惧了?
编程语言也好,网络协议也罢,其实都是人们为了“方便”而创造出来的,而为了其可靠性,我们往里面添加了我们人类的逻辑进去,那么我们从这个
逻辑去想,是不是也就能够认可或者说理解到这门技术为什么会这样?这样的好处? 那么我们学习的时候把这些逻辑放到我们人类平时的认知生活中
是不是就能更理解一些,而不是痛苦的死记和害怕。
就像上面的readyState状态,第一次0 就是XmlHttpRequest 先提前对服务器打个招呼,说“服务器老哥商量个事啊,问你要些东西”,
然后“1” Opend方法: XMLHttpRequest打开自己随身携带的包袱,里面有过来方法“method” 想要的东西“URL” 要东西的方式“async”,
2 调用send 方法:拿到数据啦,往回送
3:开始接收数据,先检查看看这个数据的头“数据信息”
4 数据没问题,全部接收完数据。
这么一想,感觉对Ajax 的状态认识也就有一种 “啊,原来如此”的感觉,感觉高大上的技术,似乎也就亲近了起来。
当然,我这样的类比其实在逻辑上还是很多漏洞的,但是也就是打个比方,给一个启示 :我们在学习的时候,是不是可以应该不止学习这门技术怎么用那么简单
而更多的问问为什么会这么做,去了解下这个技术里面透露的“逻辑性”,这么一来,对一门技术的了解,作者的思想可能会有不一样的认识。同样,
顺着这样的逻辑,自己也能去思考,这样我们是否就可以换一种方式,通过别的方式去实现这个功能? 这样的方法对于提升学习的乐趣和锻炼我们的逻辑
是不是有帮助?
以上,完。
补充:咳咳,本文纯属个人想法杂谈,如题,对技术我的认知还是比较浅显,如果有不一样的见解,还望一起留言交流。