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 = somethingif(error) {return callback(error)}callback(null, results)
})
}

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

  • 错误
try {req.body = JSON.parse(buf, options.reviver)callback()
} catch(err) {err.body = buf;err.status = 400callback(err)
}
  • 正确
try {req.body = JSON.parse(buf,options.reviver)
} catch(err) {err.body = buf;err.status = 400return 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.mzph.cn/bicheng/3370.shtml

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

相关文章

最好的电脑监控软件,监控员工的软件哪个好用

经过对百度AI的询问&#xff0c;最好的电脑监控软件是安企神&#xff0c;因为它排名第一位。 经过对AI的详细询问&#xff0c;它给出了选择安企神作为电脑监控软件的十个理&#xff1a; 获取试用版找客服 1.全面的监控功能 安企神软件提供了屏幕监控、键盘记录、文件操作记录…

【Harmony3.1/4.0】笔记二-列表

概述 列表是一种复杂的容器&#xff0c;当列表项达到一定数量&#xff0c;内容超过屏幕大小时&#xff0c;可以自动提供滚动功能。它适合用于呈现同类数据类型或数据类型集&#xff0c;例如图片和文本。在列表中显示数据集合是许多应用程序中的常见要求&#xff08;如通讯录、…

抗D盾是什么,为什么游戏被攻击了需要抗D盾

游戏行业DDoS攻击的主要原因是因为游戏产品生命周期偏短&#xff0c;而DDoS供给成本又不高&#xff0c;只要发起攻击&#xff0c;企业为确保游戏稳定运营而不得不快速做出让步&#xff0c;致使敲诈勒索的成功率相对更高。在遭受DDoS攻击后&#xff0c;游戏公司的日损失甚至多达…

git远程分支强制覆盖本地分支

目录 第一章、问题1.1&#xff09;报错提示&#xff1a;没有为分支主机或分支配置被跟踪的分支1.2&#xff09;报错分析与解决 第二章、2.1&#xff09;本地误删代码后想要git pull拉取覆盖&#xff1a;失败2.2&#xff09;报错分析和解决 友情提醒: 先看文章目录&#xff0c;…

4.24总结

对部分代码进行了修改&#xff0c;将一些代码封装成方法&#xff0c;实现了头像功能&#xff0c;通过FileInputStream将本地的图片写入&#xff0c;再通过FileOutputStream拷贝到服务端的文件夹中&#xff0c;并将服务端的文件路径存入数据库中

Java——接口

目录 一.接口的概念 二.语法规则 三.接口使用 四.接口特性 1.接口类型是一种引用类型&#xff0c;但是不能直接new接口的对象 2.接口中每一个方法都是public的抽象方法, 即接口中的方法会被隐式的指定为 public abstract&#xff08;只能是 public abstract&#xff0c…

君正X2100 RTOS 固件升级

使用cloner工具烧写固件需要在上电之前让boot_sel[2:0]处于boot from USB模式&#xff0c;但是电路板装在机壳内部后不方便改变boot_sel[2:0]的状态&#xff0c;如果要升级固件&#xff0c;需要通过机壳留出的USB口、网口、或者无线网络进行固件更新。 一、升级方案 1、固件分…

Hadoop——Yarn基础架构

Hadoop——Yarn基础架构 Hadoop YARN&#xff08;Yet Another Resource Negotiator&#xff09;是Apache Hadoop生态系统中的一个子项目&#xff0c;它是用于集群资源管理的框架&#xff0c;负责为运算程序提供服务器运算资源&#xff0c;相当于一个分布式的操作系统平台&…

Postman 工具发送请求的技巧与实践

在开发和测试 API 时&#xff0c;发送 JSON 格式的请求是一个常见需求。 在 Postman 中构建和发送 JSON 请求 创建一个新的请求 首先&#xff0c;在 Postman 启动界面上找到并点击 “New” 按钮&#xff0c;选择 “HTTP Request” 来开始新建一个请求。这一步骤允许你定义请…

指针学习总结

当指针本身定义的类型不同十&#xff0c;指向的一次性取值长度也不同 数组元素的指针 数组存放字符串 数组存放字符串时存放在栈区&#xff0c;sizeof(str1) 128字节 字符指针指向字符串 str2此时存放的是h的地址&#xff0c;因此sizeof(str2) 4字节或者8字节 并且文字常量…

递归算法/斐波那契数列

目录 递归 直接递归 间接递归 思想沿用 斐波那契数列 图片来源网络&#xff0c;侵权联系可删 递归 递归&#xff08;Recursion&#xff09;是一种编程技术&#xff0c;其中函数或方法直接或间接地调用自身。递归通常用于解决可以分解为更小、更简单的子问题的问题。递归的…

一文速览Llama 3及其微调:如何通过paper-review数据集微调Llama3 8B

前言 4.19日凌晨正准备睡觉时&#xff0c;突然审稿项目组的文弱同学说&#xff1a;Meta发布Llama 3系列大语言模型了 一查&#xff0c;还真是 本文以大模型开发者的视角&#xff0c;基于Meta官方博客的介绍&#xff1a;Introducing Meta Llama 3: The most capable openly a…

linux 系统文件目录颜色及特殊权限对应的颜色

什么决定文件目录的颜色和背景&#xff1f; 颜色 说明 栗子 权限白色表示普通文件 蓝色表示目录 绿色表示可执行文件 浅蓝色链接文件 黄色表示设备文件 红色 表示压缩文件 红色闪烁表示链接的文件有问题 灰色 表示其它文件 可以用字符表示文件的类型&am…

Netty快速入门

网络通信模型 在了解Netty之前&#xff0c;我们可以简单的先了解一下我们的网络通信方式&#xff0c;正所谓知其然&#xff0c;知其所以然。只有了解了网络通信模型&#xff0c;我们才能更好的去理解Netty的一些核心的原理。 如下图是一个简单的请求发送的时候的一个大概的HTT…

【Linux】GDB调试器学起来!指令全解,建议收藏

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

面试十五 容器

一、vector容器 template<typename T> class Allocator{ public:T* allocator(size_t size){// 负责内存开辟return (T*)malloc(sizeof(T) * size);}void deallocate(void * p){free(p);}void construct(T*p,const T&val){// 定位newnew (p) T(val);}void destroy(…

访问控制列表配置实验

ACL&#xff0c;全称 Access Control List&#xff08;访问控制列表&#xff09;&#xff0c;是一种实现访问控制的机制&#xff0c;用于规定哪些主体&#xff08;如用户、设备、IP地址、进程等&#xff09;可以对哪些资源&#xff08;如网络服务、文件、系统对象等&#xff09…

2024深圳杯C题的8页思路分析+所有代码可执行+参考文献+持续更新参考论文(已经更新了代码与图像)

比赛题目的完整版思路可执行代码数据参考论文都会在第一时间更新上传的&#xff0c;大家可以参考我往期的资料&#xff0c;所有的资料数据以及到最后更新的参考论文都是一次付费后续免费的。注意&#xff1a;&#xff08;建议先下单占坑&#xff0c;因为随着后续我们更新资料数…

docker入门学习

一、docker概念 Docker 引擎是使用的是Linux内核特性的容器引擎。 二、docker的安装 1.docker&#xff0c;下载地址&#xff1a; 桌面版&#xff1a;Docker Desktop: The #1 Containerization Tool for Developers | Docker 服务器版&#xff1a;Install Docker Engine | D…

# 从浅入深 学习 SpringCloud 微服务架构(六)Feign(3)

从浅入深 学习 SpringCloud 微服务架构&#xff08;六&#xff09;Feign&#xff08;3&#xff09; 一、组件的使用方式总结 1、注册中心 1&#xff09; Eureka 搭建注册中心 引入依赖 spring-cloud-starter-netflix-eureka-server。 配置 EurekaServer。 通过 EnableEure…