Node.js学习笔记-02

news/2024/12/5 9:21:56/

三、node的异步I/O

四、异步编程

1、函数式编程

高阶函数

函数可以作为参数或者返回值。

偏函数用法

偏函数用法是指创建一个调用另外一个部分——参数或变量已经预置的函数——的函数的用法。

举个例子:在JavaScrip中进行类型判断时,我们通常会进行类似上述代码的方法定义。如下代码存在的问题是需要重复去定义一些相似的函数,如果有 更多的isXXX(),就会出现更多的冗余代码。

var toString = Object.prototype.toString;
var isString = function (obj){return toString.call(obj) =='[object String]';
}
var isFunction = function (obj){return toString.call(obj) == '[object Function]';
}

改造以后

var isType = function (type) {return function (obj) {return toString.call(obj) == '[object ' + type + ']';}
}
var isString = isType('String')
var isFunction = isType('Function')
console.log(isString)
console.log(isFunction)

2、异步编程的优势与难点

Node利用JavaScript及其内部异步库,将异步直接提升到业务层面,这是一种创新。

优势

Node带来的最大特性莫过于基于事件驱动的非阻塞I/O模型,这是它的灵魂所在。非阻塞I/0可以使CPU与I/O并不相互依赖等待,让资源得到更好的利用。对于网络应用而言,并行带来的想象空间更大,延展而开的是分布式和云。并行使得各个单点之间能够更有效地组织起来,这也是Node在云计算厂商中广受青睐的原因,图4-1为异步IO调用的示意图。

难点

  1. 异常处理
  2. 函数嵌套过深
  3. 阻塞代码
  4. 多线程编程
  5. 异步转同步

3、异步编程的解决方案

1. 事件发布/订阅模式

2.Promise / Deferred

3.流程控制库

4、异步并发控制

五、内存控制

V8的内存限制:

在一般的 后端开发语言中,在基本的内存使用上没有什么限制。然而在Node中通过JS使用内存时就会发现只能使用部分内存(64位系统下约为1.4GB,32位系统下 约为0.7GB)。在这样的限制下,将会导致Node无法直接操作大内存 对象。

高效使用内存

这一节中定义的闭包概念是:
实现外部作用域访问内部作用域中变量的方法叫做闭包(closure)。

小结:
在正常的JavaScript执行中,无法立即回收的内存有闭包和全局变量引用这两种情况。由于V8的内存限制,要十分小心此类变量是否无限制地增加,因为它会导致老生代中的对象增多。

六、理解 Buffer

Buffer是一个像Array的对象,但它主要用于操作字节。下面我们从模块结构对象结构的层面上来认识它。

1、Buffer结构

模块结构:
Buffer 是一个典型的JavaScript与C++结合的模块,它将性能相关部分用C++实现,将非性能相关的部分用JavaScript实现。

Buffer所占用的内存不是通过V8分配的,属于堆外内存。由于V8垃圾回收性能的影响,将常用的操作对象用更高效和专有的内存分配回收策略来管理是个不错的思路。

由于 Buffer 太过常见,Node 在进程启动时就已经加载了它,并将其放在全局对象(global)上。所以在使用Buffer时,无需通过 require() 即可直接使用。

2、Buffer的转换

3、Buffer的拼接

4、Buffer与性能


http://www.ppmy.cn/news/984801.html

相关文章

【linux 结束pts/1踢人踢除另一个终端】

centos7上误执行了个命令,导致一直刷屏,强制CTRLC无法正常退出,一直出现如下: 网上搜索通过ctrlD,q均无法正常退出, 不想强行关掉,通过:who命令查看均用户: who mshns…

什么是消息队列?

目录 什么是消息队列? 消息队列中间件 消息队列的应用场景 异步处理 系统解耦 流量削峰 日志处理 什么是消息队列? 消息队列,英文名:Message Queue,经常缩写为MQ。从字面上来理解,消息队列是一种用来…

郑州Sectigo DV通配符SSL证书

我们在浏览器访问网页时或许不会注意到网站是http还是https链接,但是一定能注意到浏览器给我们展示的“不安全”警告,警告访问者网站未加密,访问网站会有泄露隐私的危险。SSL证书能将网站链接由http转为https,对网站传输数据加密&…

有状态的应用如何部署 1?

前面我们分享很多关于 K8S 的内容,有没有发现 pod 都是无状态,RS / RC 管理的 pod 也是无状态的,我们可以任意删除一个 pod,副本管理器又会马上给我们创建一个 pod 那么如果咱们的这个 pod 是有挂载持久卷的,那么我们…

uni-app在小米手机上运行【步骤细节】

注意细节重点: 1.手机使用数据线与电脑连接,手机连接模式必须是传输文件模式 2.手机必须打开开发者模式 3.打开开发者模式后,仔细浏览并调整USB调试权限,重点打开USB是否允许安装按钮!!! 操作步…

DRUPAL 8.x远程代码执行漏洞(CVE-2018-7600)

事件背景 框架漏洞收集 CVE-2018-7600有两个POC分别是7和8的,本文仅研究8版本的POC,与其它的文章不同的事,本文我将数据流向调试并记录下来了 漏洞说明 1. 漏洞原理:Drupal对表单请求内容未做严格过滤,因此&#x…

RN 设置背景图片(使用ImageBackground组件)

在RN版本0.46版本的时候添加了ImageBackground控件。ImageBackground可以设置背景图片,使用方法和image一样,里面嵌套了其他的组件 import React from "react"; import { ImageBackground, StyleSheet, Text, View } from "react-native…

C#实现计算题验证码

开发环境:C#,VS2019,.NET Core 3.1,ASP.NET Core API 1、建立一个验证码控制器 新建两个方法Create和Check,Create用于创建验证码,Check用于验证它是否有效。 声明一个静态类变量存放列表,列…