Nodejs--异步编程

异步编程

函数式编程

高阶函数

在通常的语言中,函数的参数只接受基本的数据类型或者是对象引用,返回值只能是基本数据类型和对象引用。

function foo(x) {
  return x
}

高阶函数是把函数作为参数,将函数作为返回值的函数

function foo(x) {
  return function () {
    return x
  }
}

高阶函数可以将函数作为输入或者返回值的变化

偏函数用法

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

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]'
}

在JavaScript中进行类型判断的时候,通常会进行类型上述代码的方法进行定义,但是上面的代码出现了冗余代码,为了解决重复定义的问题,引入一个姓的函数,这个新的函数可以和重唱一样批量创建类似的函数

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

== 这种通过指定部分参数类产生一个新的定制函数的形式叫偏函数==

异步编程的优势和难点

node带来的最大特性:事件驱动的非阻塞I/O模型。非阻塞io可以使得cpu和io并不相互依赖等待,让资源得到更好的利用,对于网络引用而言,并行带来的想象空间更大
在这里插入图片描述

如果采用传统的同步io模型,分布式计算中的性能会大打折扣
在这里插入图片描述

难点

异常处理

异步io的实现主要包括两个阶段,提交请求和处理结构,这两个阶段中又事件循环的调度,两者互不关联,异步方法通常在第一个阶段请求后立即返回,因为异常不一定发生在这个阶段。

var async = function(callback) {
    process.nextTick(callback)
}

调用async()方法后,callback被存储起来,直到下一次tick才会取出来,尝试用异步方法进行try/catch操作只能捕获档次时间循环内的一场,对于callback执行时抛出的异常无能为力

try {
    async(callback)
}catch(e) {
//todo
}

node在一场处理上形成了一种约定: 将异常作为回调函数的第一个实参传回,如果是空值,则表明调用没有异常抛出

async(function (err, results) {
    //todo
})
  1. 必须执行调用者传入的回调函数
  2. 正确传递回异常供调用者判断
var async = function(callback) {
    process.nextTick(function() {
    var results = something
    if(error) {
        return callback(error)
    }
    callback(null, results)
})
}

在异步方法的编写中,另一个容易犯的错误是对用户传递的回调函数进行异常捕获

  • 错误
try {
    req.body = JSON.parse(buf, options.reviver)
    callback()
} catch(err) {
    err.body = buf;
    err.status = 400
    callback(err)
}
  • 正确
try {
    req.body = JSON.parse(buf,options.reviver)
} catch(err) {
    err.body = buf;
    err.status = 400
    return callback(err)
}
callback()
函数嵌套过深

dom事件相对而言不会存在相互依赖或者需要多个事件一起写作的场景,较少出现异步多级依赖的情况,但是对于node而言,事务中存在多个异步调用的场景

fs.readdir.join(__dirname, '..'), function(err, files) {
    files.forEach(function(filename, index){
        fs.readFile(filename, "utf8",function(err, file) {
        })
    })
}
阻塞代码

node中没有sleep()

var start = new Date()
while(new Date() - start < 1000 ) {
 //  todo
}
// 需要阻塞的代码

这段代码是糟糕的,会一直占用cpu进行判断,并不能让进程沉睡

多线程编程

在谈论JavaScript的时候,通常是单一线程上的代码,浏览器中指的是JavaScript执行线程和ui渲染共用的一个线程,在node中,没有ui渲染的部分。模型基本相同,对于服务器端,单个node不会充分利用多核cpu的,web workers 通过对JavaScript执行和ui渲染分开,更好的利用了多核cpu进行大量运算。
在这里插入图片描述

前端浏览器对于标准的之后性,web worker没有应用起来。web worker能利用cpu喝减少阻塞ui渲染,但是不能解决ui渲染的效率问题,node借鉴了这个模式。

异步转同步

node中同步编程,不能得到原生手段的支持,需要借助库或者编译手段来实现。对于异步调用,存在良好的流程控制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/573870.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Oceanbase体验之(二)Oceanbase集群的搭建(社区版4.2.2)

资源规划 3台observer CPU:4C及以上 内存&#xff1a;32G及以上 硬盘操作系统500G 存储盘1T及以上 虚拟机可以直接划分&#xff0c;物理机需要提前规划好资源 一、上传oceanbase安装包 登录ocp选择软件包管理 上传Oceanbase软件包&#xff08;软件包获取路径 官网免费下载社…

JavaWeb--04YApi,Vue-cli脚手架Node.js环境搭建,创建第一个Vue项目

04 1 Yapi2 Vue-cli脚手架Node.js环境搭建配置npm的全局安装路径 3 创建项目&#xff08;这个看下一篇文章吧&#xff09; 1 Yapi 前后端分离中的重要枢纽"接口文档",以下一款为Yapi的接口文档 介绍&#xff1a;YApi 是高效、易用、功能强大的 api 管理平台&#…

Hive主要介绍

Hive介绍 hive是基于 Hadoop平台操作 HDFS 文件的插件工具 可以将结构化的数据文件映射为一张数据库表 可以将 HQL 语句转换为 MapReduce 程序 1.hive 是由驱动器组成&#xff0c;驱动器主要由4个组件组成&#xff08;解析器、编译器、优化器、执行器&#xff09; 2.hive本身不…

递归排列枚举(c++)

全部排列问题 输入 n 输出 1…n 个数的全部排列。全部排列中&#xff0c;数字可以重复 。 例如 输入 3 输出全部排列的结果如下&#xff1a;111、112、113、121、122、123、131、132、133、211、212、213、221、222、223、231、232、233、311、312、313、321、322、323、33…

4.18.2 EfficientViT:具有级联组注意力的内存高效Vision Transformer

现有Transformer模型的速度通常受到内存低效操作的限制&#xff0c;尤其是MHSA&#xff08;多头自注意力&#xff09;中的张量整形和逐元素函数。 设计了一种具有三明治布局的新构建块&#xff0c;即在高效FFN&#xff08;前馈&#xff09;层之间使用单个内存绑定的MHSA&#x…

浅谈数据模型

1&#xff1a;事实表和维表的概述 前言&#xff1a;数据仓库是一种用于存储和管理大量数据的技术。其中&#xff0c;事实表和维表是数据仓库中的两个重要概念&#xff0c;首先了解一下事实表和维度表 1.事实表&#xff1a;是指用于存储测量“事实数据”的表&#xff0c;事实数…

Unity 异常 bug

OverlapBoxNonAlloc 使用bug 环境&#xff1a; Unity2021.3.15 在测试场景中使用 OverlapBoxNonAlloc 测试检测没有问题 但是到了真实应用场景&#xff0c;使用 OverlapBoxNonAlloc 检测移动中的小怪 小怪碰撞体为&#xff1a;带有 Rigidbody 的Circle Collider 2D 就会出现异…

Java虚拟机(jvm)常见问题总结

1.电脑怎样认识我们编写的Java代码 首先先了解电脑是二进制的系统&#xff0c;他只认识 01010101比如我们经常要编写 HelloWord.java 电脑是怎么认识运行的HelloWord.java是我们程序员编写的&#xff0c;我们人可以认识&#xff0c;但是电脑不认识 Java文件编译的过程 1. 程…

代码随想录(番外)图论3|1020. 飞地的数量|130. 被围绕的区域

代码随想录&#xff08;番外&#xff09;图论3|1020. 飞地的数量|130. 被围绕的区域 1020. 飞地的数量 class Solution { public:int dir[4][2]{0,1,1,0,0,-1,-1,0};int count;void dfs(vector<vector<int>>& grid,int x,int y){grid[x][y]0;count;for(int i…

大数据开发详解

点击下载《大数据开发详解》 1. 前言 随着信息化时代的快速发展&#xff0c;大数据已经成为了企业和组织不可或缺的重要资源。大数据开发则是指通过一系列技术手段&#xff0c;对海量数据进行收集、存储、处理、分析和挖掘&#xff0c;以实现数据的价值化利用。大数据开发涉及…

哈希表练习题

前言 本次博客将要写一写&#xff0c;哈希表的一些使用 哈希表主要是一个映射&#xff0c;比如数组就是一个哈希表 是一个整型对应另一个整型&#xff0c;介绍的哈希表还是要以写题目为例 第一题 242. 有效的字母异位词 - 力扣&#xff08;LeetCode&#xff09; 直接来看…

C# 给图片添加文字水印

目录 应用场景 开发运行环境 方法说明 方法代码 调用示例 小结 应用场景 在某些应用项目&#xff08;如电子档案信息管理&#xff09;中&#xff0c;查看电子图片信息是经常使用到的功能&#xff0c;此时我们就需要给显示在浏览器中的图片添加文字水印版权或提示信息。…

Java面试八股之Java中==和equals()的区别

Java中和equals()的区别 操作符&#xff1a; 对于基本数据类型&#xff08;如int、char、boolean等&#xff09;&#xff0c;比较的是它们的值是否相等。 对于对象引用类型&#xff0c;比较的是两个对象的内存地址&#xff08;即是否指向同一个对象实例&#xff09;。也就是…

Jetbrains Fleet这十个快捷键,效率提高50倍

当我们无法解决一段感情中的问题 就会选择解决这段感情 如果真诚不得到回应 那么再热情的人 也会沉默 很多人对你感兴趣 却没有人执着于你 我们知道任何一款牛批的IDE 都是有很多快捷键的,但是我们没有superpower ,不能记住所有的快捷键。 所以下面就总结了使用fleet 过…

电磁兼容(EMC):静电放电(ESD)抗扰度试验深度解读(七)

目录 1. 第一步 确定电磁环境 2. 第二步 确认设备工作状态 3. 第三步 制定试验计划 4. 间接施加的放电 4.1 水平耦合板 4.2 垂直耦合板 静电抗扰度的试验测试细节对测试结果影响比较大&#xff0c;本文详细介绍静电抗扰度试验的测试程序和注意事项。 1. 第一步 确定电磁…

PostgreSQL的学习心得和知识总结(一百三十九)|深入理解PostgreSQL数据库GUC参数 allow_alter_system 的使用和原理

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

【学习】​CSMM和CMMI的关系你了解吗

CMMI和CSMM都是评估和提升软件组织能力成熟度的模型&#xff0c;但它们在起源、应用范围、模型结构和实施目的等方面存在一些区别。在当今竞争激烈的软件市场中&#xff0c;提升软件能力成为了多数组织追求成功的关键因素。而选择适合的体系标准能够助力企业发展得更加迅速。作…

企业实施定制鞋厂ERP软件需要注意哪些问题?

企业实施定制鞋厂ERP软件是个复杂的管理系统工程&#xff0c;为了成功地为企业定制实施ERP软件&#xff0c;需要注意和解决几个关键的问题&#xff1a; . 确立ERP系统实施和定制的决策者&#xff1b;. 做好前期咨询与调研工作&#xff1b;. 做好系统产品或项目迭代规划&#x…

【MySQL 数据宝典】【内存结构】- 003 Change Buffer 详解

一、 Change Buffer基本概念 Change Buffer&#xff1a;写缓冲区,是针对二级索引(辅助索引) 页的更新优化措施。 作用: 在进行DML操作时&#xff0c;如果请求的是 辅助索引&#xff08;非唯一键索引&#xff09;没有在缓冲池 中时&#xff0c;并不会立刻将磁盘页加载到缓冲池…

【Qt】设置QT标准对话框为中文字体

设置QT标准对话框为中文字体 一、问题二、解决方法1、找到Qt内置的翻译文件 qt_zh_CN.qm2、在代码中加载该文件 一、问题 在Qt中我们使用的标准对话框都是英文&#xff0c;例如下面的 字体选择对话框&#xff0c;但是实际中我们需要构建的是中文对话框。 所以我们需要使用Qt官…