JavaScript setInterval 和 ‘this’ 的解决方案

By default, setInterval中的this 是被绑定到global context, 如果你想绑定到current context, 有如下几种解决方案:

(本文来自于stackoverflow: https://stackoverflow.com/questions/2749244/javascript-setinterval-and-this-solution)

Code:

prefs: null,
startup : function()
{
// init prefs
...
this.retrieve_rate();
this.intervalID = setInterval(this.retrieve_rate, this.INTERVAL);
}

如果我们想在setInterval里面access this,可以:

  1. 使用.bind
this.intervalID = setInterval(this.retrieve_rate.bind(this), this.INTERVAL);

2. 在函数外,把this 赋值给其他变量,常见是that 和 self

var self = this;
this.intervalID = setInterval(
function() { self.retrieve_rate(); },
this.INTERVAL);

3. 使用arrow function, 箭头函数

startup : function()
{
// init prefs
...
this.retrieve_rate();
this.intervalID = setInterval( () => this.retrieve_rate(), this.INTERVAL);
}

US 大型服务商wifi calling 所需的port和 domain(ePDG)

Wifi Calling 一般是通过IPSEC tunnels

Port 这个很简单,就是在UDP下需要打开如下端口:

UDP – port 500 (IPsec – IKE)
UDP – port 4500 (IPsec – NAT traversal)

MTU一般推荐设置为1500.

ePDG: Evolved Packet Data Gateway

ePDG其实就是一个FQDN, 很多服务商都发布了他们的ePDG. 国内一般用的比较多的是t-mobile 的wifi calling. 所以可以多关注一个t-mobile 的 ePDG

AT&T:

epdg.epc.att.net
sentitlement2.mobile.att.net
vvm.mobile.att.net
mmsc.mobile.att.net

Verizon:

wo.vzwwo.com
sg.vzwfemto.com

T-Mobile:

epdg.epc.mnc260.mcc310.pub.3gppnetwork.org
ss.epdg.epc.mnc260.mcc310.pub.3gppnetwork.org
ss.epdg.epc.geo.mnc260.mcc310.pub.3gppnetwork.org

在Android/iPhone上抓包

因为要debug一个app为什么无法启动,就研究了一下抓包.  目前主流的在android 和iphone上都可以抓包的是fiddler, 使用简单,不用root, 操作简便,UI简明. 但是缺点就是只能抓包http/https协议,无法抓包第四层tcp/udp协议. 在android上也可以抓包使用tcpdump. 此篇文章只简单记录一下fiddler.

总体流程分为这么几步: 在电脑上安装fiddler; 简单配置fiddler; 手机上安装证书; 手机设置proxy, 让所有http/https流量经过fiddler; 抓包. 

前提条件是电脑和手机在一个局域网内.

下面详细说一下:

  1. 下载fiddler. 只需要下载免费的fiddler classic就可以了. 下载地址如下
https://www.telerik.com/fiddler/fiddler-classic

2. 简单配置fiddler远程连接

Fiddler 如果抓取 https 协议会话需要进一步配置,在 Tools ->Options 菜单下,选择HTTPS标签并配置如下:

手机抓取需要配置远程连接,在 Tools ->Options 菜单下,选择Connections标签并配置如下:

Fiddler listens on port是手机连接fiddler时的代理端口号,默认8888即可;

Allow remote computers to connect是允许远程发送请求,需要勾上.

防火墙需要开放8888端口,注意如果你使用的是windows的话,这个防火墙已经自动配置好了.

3. 手机安装fiddler证书, 这里需要手机和电脑在同一个局域网之内. 下面以iphone为例说明,安卓的步骤差不多.

在电脑上通过cmd敲命令ipconfig查看本机的ipv4地址.

打开手机浏览器,输入 http://【fiddler电脑IP地址】:【fiddler设置的端口号】,例如 http://192.168.123.100:8888 可以下载证书并安装。

在打开的页面中,点击 FiddlerRoot certificate 下载证书,点击允许

在Settings系统设置中,点击 Profile Downloaded(已下载的配置文件):

点击install, 安装证书

不同系统手机的下载路径不一样,例如有的是: 设置->通用->关于本机->证书信任设置

4 手机配置代理

手机设置 -> WLAN -> 选择无线网络 -> HTTP Proxy,选择 Manual,Server 为 Fiddler 的电脑 ip 地址,端口号为 Fiddler 的端口号:

 

此时操作浏览器或APP,在 fiddler 中可以看到完成的请求和响应数据: