常见问题问答

发布时间 2023-04-09 18:58:36作者: wish123

1. Promise底层原理

promise是一种用于处理异步操作的javascript对象,底层原理基于回调函数、事件监听和状态机等技术。在promise对象创建时,会初始化一个状态,通常有三种状态:pending(进行中)、fulfilled(已完成)和rejected(已拒绝)。

当使用promise封装的异步操作成功完成时,promise状态将变为fulfilled;如果发生错误,则状态将变为rejected。在这两种情况下,promise都会触发相应的回调函数。

在promise代码中,通过使用then()方法来添加回调函数。如果promise对象状态为fulfilled,则执行第一个回调函数;如果状态为rejected,则执行第二个回调函数。catch()方法用于捕获异常,并执行对应的回调函数。

promise的优势在于可以解决回调**问题,避免嵌套的回调函数造成代码难以读取和维护的问题。同时,它还可以更好地控制异步操作的流程和结果,提高代码质量和可读性。

 

2. PHP中,为什么需要pack和unpack?网络传输中为什么要将二进制数据与字符串之间进行转换?

在PHP中,pack和unpack是用于将二进制数据与字符串之间进行转换的两个函数。

pack函数

pack函数可以将数据打包成二进制字符串。它需要两个参数:第一个参数是一个格式字符串,用于指定打包后数据的格式;第二个参数是一个数组,包含要打包的数据。

例如,如果要将一个整数和一个浮点数打包成二进制字符串,可以这样使用pack函数:

php复制代码
$data = pack("if", 123, 3.14);

在上面的代码中,"if"表示要打包一个整数(i)和一个浮点数(f),123和3.14分别是要打包的数据。打包完成后,$data变量将保存一个二进制字符串。

unpack函数

unpack函数可以将二进制数据解包成一个数组。它需要两个参数:第一个参数是一个格式字符串,用于指定解包后数据的格式;第二个参数是要解包的二进制数据。

例如,如果要将上面打包的二进制字符串解包成一个数组,可以这样使用unpack函数:

php复制代码
$array = unpack("iint/ffloat", $data);

在上面的代码中,"iint/ffloat"表示要解包两个整数(iint)和一个浮点数(ffloat)。data是要解包的二进制数据。解包完成后,data是要解包的二进制数据。解包完成后,array变量将保存一个关联数组,其中键名为解包指令字符串中的名称,值为对应的解包数据。

在网络传输中,数据的存储和传输必须以二进制形式进行,因为计算机处理和存储数据时使用的是二进制系统。而字符串则是一种人类可读的形式,用于表示文本或其他符号。因此,在网络传输中,需要将二进制数据转换成字符串格式,以便于人们查看和理解。

另一方面,当我们在网络上传输字符串数据时,为了确保数据的正确性和完整性,也需要将字符串数据转化为可以被计算机读取和处理的二进制格式。这是因为网络传输中的数据容易受到干扰和损坏,例如数据包丢失、延迟、重复等问题,因此需要采用各种技术来保证数据的准确性,如校验和、crc 等技术。

综上所述,网络传输中二进制数据与字符串之间的转换是为了充分利用计算机和人类的优势,使得数据能够在网络环境下流畅地传输和处理。

 

3. 如果局域网中的客户端计算机访问远程服务器,那么远程服务器只能获取到客户端局域网中的网关IP吗?

是的,如果局域网中的客户端计算机访问远程服务器,那么远程服务器只能获取到客户端局域网中的网关ip。这是因为在一个局域网中,所有的客户端计算机共享同一个公共 ip 地址,并且通过本地路由器或网关与外部网络通信。当客户端计算机访问远程服务器时,请求首先发送到路由器或网关,然后由路由器或网关转发到远程服务器。对于远程服务器来说,它只看到请求来自于局域网中的网关ip地址,而无法知道实际发起请求的客户端计算机的ip地址。

 

4. 网络传输中,由于使用了cdn等代理服务器,后端只能拿到代理服务器的IP,后端又怎么能获取到真正的客户端IP呢?

在服务器局域网中,后端服务器获取到的都是代理服务器的IP,但代理服务器把数据包在转发给内部计算机时,通常会带上x-forwarded-for等头信息,后端服务器通过获取这些字段可以获取到真正的IP。