Nodejs--异步编程

news2025/1/19 7:52:53

异步编程

函数式编程

高阶函数

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最短路问题之Bellman-Ford,SPFA算法,例题 负环

Bellman-Ford算法&#xff1a; Bellman-Ford算法用于解决带有负权边的单源最短路径问题。其基本思想是通过不断地松弛边来逐步求解最短路径。算法的主要步骤如下&#xff1a; 初始化&#xff1a;将源点到各个顶点的距离初始化为无穷大&#xff0c;源点的距离初始化为0。重复更…

二. 搭建Nginx 直播流程服务器

目录 1. 前言 2. 安装 Nginx 依赖 3.下载源码 4. 编译安装 5.配置 rtmp 服务 6.验证配置 1. 前言 服务器由 NGINXRTMP 构成。 NGINX 是 HTTP 服务器&#xff0c; RTMP 是附加模块。 其中 NGINX 我选择的是用 源码编译方式 进行安装&#xff0c;因为这种方式可以自定义…

Three.js入门学习笔记

学习资料&#xff1a; 【Three.js】Three.js快速上手教程_three.module.js-CSDN博客 2024年了&#xff0c;是该学学Three.js了_three.js 2024-CSDN博客 一、three.js简介 three.js是JavaScript编写的WebGL第三方库。 three.js&#xff0c;webGL&#xff0c;openGL三者的关…

WEB前端-笔记(三)

目录 一、事件 1.1类型 1.2对象 1.3页面加载事件 1.4滚动事件 1.5尺寸事件 1.6捕获&冒泡事件 1.7阻止表单提交 1.8全选案例 1.9事件委托 ​编辑 1.10client&offset 1.11换取元素的位置 1.12创建节点 1.13克隆节点 1.14删除节点 1.15setTimeout 1.16s…

人工智能入门(一):基于Pytorch的手写数字识别模型

前言&#xff1a; 因为还在上学&#xff0c;时间不太够用&#xff0c;很多内容写到后面心有余力不足&#xff0c;未来有时间我会慢慢补充。人工智能的知识涉猎范围广又杂乱无章&#xff0c;啃书或上课学到的知识往往很早就过时了或者离实际的项目无关。所以&#xff0c;我很希…

【Git教程】(十七)发行版交付 — 概述及使用要求,执行过程及其实现,替代解决方案 ~

Git教程 发行版交付 1️⃣ 概述2️⃣ 使用要求3️⃣ 执行过程及其实现3.1 预备阶段&#xff1a;创建 stable 分支3.2 预备并创建发行版3.3 创建补丁 4️⃣ 替代解决方案 对于每个项目或产品来说&#xff0c;发布版本的创建都需要一定的时间&#xff0c;其具体过程因各公司或组…

arm版Linux下安装大数据集群各种组件

背景&#xff1a;由于本人是用的Macbookpro m2来进行开发的&#xff0c;很多环境和Intel芯片的都不一样&#xff0c;期间安装各种软件遇到各种问题&#xff0c;为了以后不走之前的老路&#xff0c;现记录各种软件的安装步骤。 系统安装组件说明 序号组件名称组件版本1jdkjdk-…

2024年电子商务与大数据经济国际会议 (EBDE 2024)

2024年电子商务与大数据经济国际会议 (EBDE 2024) 2024 International Conference on E-commerce and Big Data Economy 【会议简介】 2024年电子商务与大数据经济国际会议即将在厦门召开。本次会议旨在汇聚全球电子商务与大数据经济领域的专家学者&#xff0c;共同探讨电子商务…

基于MaxKB搭建一个知识库问答系统

什么是MaxKB MaxKB 是一款基于 LLM 大语言模型的知识库问答系统。MaxKB Max Knowledge Base&#xff0c;旨在成为企业的最强大脑。 开箱即用&#xff1a;支持直接上传文档、自动爬取在线文档&#xff0c;支持文本自动拆分、向量化&#xff0c;智能问答交互体验好&#xff1b…

深度学习| 注意力机制

注意力机制 为什么需要注意力机制Seq2Seq问题Transfomer Attention注意力机制分类软硬注意力注意力域 为什么需要注意力机制 这个可以从NLP的Seq2Seq问题来慢慢理解。 Seq2Seq问题 Seq2Seq&#xff08;Sequence to Sequence&#xff09;&#xff1a;早期很多模型中&#xff…

扭蛋机小程序对市场的发展有哪些推动作用?

近几年&#xff0c;扭蛋机发展的非常迅猛。随着二次元文化的火热&#xff0c;给扭蛋机带来了发展机遇&#xff0c;扭蛋机行业也受到了大众的喜爱。扭蛋机的商品种类多样化&#xff0c;包含了各类热门IP周边衍生品、玩具、小商品等&#xff0c;适合所有消费人群&#xff0c;市场…

2024年汉字小达人活动还有5个月开赛:来做18道历年选择题备考吧

现在距离2024年第11届汉字小达人比赛还有五个多月的时间&#xff0c;如何利用这段时间有条不紊地备考呢&#xff1f;我的建议是两手准备&#xff1a;①把小学1-5年级的语文课本上的知识点熟悉&#xff0c;重点是字、词、成语、古诗。阅读理解不需要。②把历年真题刷刷熟&#x…

【漏洞复现】云时空社会化商业ERP系统slogin SQL注入漏洞

漏洞描述&#xff1a; 云时空社会化商业ERP系统slogin存在SQL注入漏洞&#xff0c;攻击者可以通过此漏洞获取数据库敏感信息。 搜索语法: Fofa-Query: app"云时空社会化商业ERP系统" 漏洞详情&#xff1a; 1.云时空社会化商业ERP系统。 2.漏洞POC&#xff1a; …

浏览器和nodejs中的eventloop

浏览器和nodejs中的eventloop 浏览器中的Event Loop 在浏览器中&#xff0c;设计成为了单线程。如果要处理异步请求&#xff0c;则需要增加一层调度逻辑&#xff0c;把js代码封装成一个个的任务&#xff0c;放在一个任务队列中&#xff0c;主线程不断的读取任务执行。每次调取…

IDEA2023版本创建Sping项目无法使用Java8

1. 问题复现 1.1 当前版本2023.3.2 1.2 创建项目时&#xff1a;不存在jdk8选项 提示报错 1.3 原因分析 Spring官方发布Spring Boot 3.0.0 的时候告知了一些情况&#xff0c;Java 17将成为未来的主流版本 2. 如何解决 2.1 替换创建项目的源 我们只知道IDEA页面创建Spring项目…

玩转PyCharm

玩转PyCharm PyCharm是由JetBrains公司开发的提供给Python专业的开发者的一个集成开发环境&#xff0c;它最大的优点是能够大大提升Python开发者的工作效率&#xff0c;为开发者集成了很多用起来非常顺手的功能&#xff0c;包括代码调试、高亮语法、代码跳转、智能提示、自动补…

历史遗留问题-Oracle 19c RAC 安装时节点连接性问题

测试服务器的二节点数据库宕掉了&#xff0c;原因不明&#xff0c;需要产环境重新安装。我想上次在自己虚拟机安装实验过一次&#xff0c;应该一天能搞定&#xff0c;事实证明&#xff0c;你永远有学不完的bug&#xff01;&#xff01;&#xff01;&#xff01; 首先查看一下系…

python 调试 c++源码

1. gdb常用调试命令概览和说明 2. 编译c库设置Debug模式 cmake设置debug 在CMake中设置debug模式通常意味着启用调试信息和优化。以下是一个简单的CMakeLists.txt文件示例&#xff0c;展示了如何设置项目以便在Debug模式下构建&#xff1a; cmake_minimum_required(VERSION 3…

【WEEK9】 【DAY3】JSR303数据校验及多环境切换【中文版】

2024.4.24 Wednesday 目录 4.JSR303数据校验及多环境切换4.1.JSR303数据校验&#xff08;了解即可&#xff09;4.1.1.修改Person.java4.1.2.修改pom.xml&#xff08;添加依赖&#xff09;4.1.3.运行Springboot02ConfigApplicationTests.java进行测试4.1.4.使用数据校验&#x…

HotSpot JVM 中的应用程序/动态类数据共享

0.前言 本文的目的是详细讨论 HotSpot JVM 自 JDK 1.5 以来提供的一项功能&#xff0c;该功能可以减少启动时间&#xff0c;但如果在多个 JVM 之间共享相同的类数据共享 (CDS) 存档&#xff0c;则还可以减少内存占用。 1.类数据共享 (CDS) CDS 的想法是使用特定格式将预处理…