防止重复发送Ajax请求
方案:函数防抖+用户点击之后按钮disabled+函数节流
- 1、使用防抖函数限定在一定时间内连续地点击只有第一次是有效的。
- 2、如果后台请求处理很慢,第一次有效请求发送过去后后台在处理,直到第二次有效请求还没处理完,这时后台可能会发生错误,解决办法,第一次请求过后就把点击按钮disabled,直到请求响应之后才enable。
- 3、如果后台处理很快,多次点击都是有效的且能及时处理,但是并不需要这么多请求(比如查询请求,其实都是一个结果,没必要重复请求,可能是用户无意多点了,也可能是用户无聊故意多点了,也有可能是恶意攻击),这时就取一个请求间隔时间,比如5s(不同请求可以设置不同值)。
- 4、所以最终取设定时间与后台处理返回时间的更大值即可。
闭包
- 闭包是javascript支持头等函数的一种方式,它是一个能够引用其内部作用域变量(在本作用域第一次声明的变量)的表达式,这个表达式可以赋值给某个变量,可以作为参数传递给函数,也可以作为一个函数返回值返回。
- 闭包是函数开始执行的时候被分配的一个栈帧,在函数执行结束返回后仍不会被释放(就好像一个栈帧被分配在堆里而不是栈里!)
- 闭包的应用:
- 比如写柯里化函数的时候利用闭包,保存参数在内存中:
var currying = function(fun) { //格式化arguments var args = Array.prototype.slice.call(arguments, 1); return function() { //收集所有的参数在同一个数组中,进行计算 var _args = args.concat(Array.prototype.slice.call(arguments)); return fun.apply(null, _args); }; }
- 模拟私有变量或是私有方法:
const people = (num) => { var num = num; return { increase: () => { num++; }, get: () => { return num; } } } const man = people(4); man.increase(); man.get();
- 避免引用错误:
for (var i = 0; i < 4; i++) { (function(_i) { setTimeout(function() { console.log(_i) }, 1000) })(i) }
new 关键字过程
- 创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型。
- 属性和方法被加入到 this 引用的对象中。
- 新创建的对象由 this 所引用,并且最后隐式的返回 this 。
伪代码如下:
var obj = {};
obj.__proto__ = Foo.prototype; //Foo为构造函数
Foo.call(obj);
retun obj;
TCP vs UDP
- TCP面向连接(确认有创建三方交握,连接已创建才作传输。)
- UDP不是面向连接的,UDP传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号,发送端不知道数据是否会正确接收,当然也不用重发,所以说UDP是无连接的、不可靠的一种数据传输协议。
- UDP传输速率更高,因为不必确认收发数据,实时性更好
- TCP数据是有序的,以什么顺序发送的数据,接收时同样会按照此顺序;UDP是无序的,发出(1,2,3),有可能按照(1,3,2)的顺序收到。应用程序必须自己做分组排序。
TCP不会丢包的机制实现
TCP是通过序列号确认号和计时器来检测丢包和保证数据顺序的。使用校验和来检测报文段的错误。
- 1、发送方首先发送第一个包含序列号为1(可变化)和1460字节数据的TCP报文段给接收方。接收方以一个没有数据的TCP报文段来回复(只含报头),用确认号1461来表示已完全收到并请求下一个报文段。
- 2、发送方然后发送第二个包含序列号为1461和1460字节数据的TCP报文段给接收方。正常情况下,接收方以一个没有数据的TCP报文段来回复,用确认号2921(1461+1460)来表示已完全收到并请求下一个报文段。发送接收这样继续下去。
- 3、然而当这些数据包都是相连的情况下,接收方没有必要每一次都回应。比如,他收到第1到5条TCP报文段,只需回应第五条就行了。在例子中第3条TCP报文段被丢失了,所以尽管他收到了第4和5条,然而他只能回应第2条。
- 4、发送方在发送了第三条以后,没能收到回应,因此当时钟(timer)过时(expire)时,他重发第三条。(每次发送者发送一条TCP报文段后,都会再次启动一次时钟:RTT)。
- 5、这次第三条被成功接收,接收方可以直接确认第5条,因为4,5两条已收到。