深入浅出nodejs学习笔记--第四章 异步编程


这一章的知识跨度看起来不广,但是知识深度的还是挺深的,异步编程作为nodejs的核心,个人同时需要一定的深度才可以去理解。

在这一章提到了函数式编程和异步编程解决方案的两个知识点,首先来了解一下函数式编程


函数式编程

这里先放一本书,https://www.gitbook.com/book/llh911001/mostly-adequate-guide-chinese/details 觉得讲得不错,因为越到后面越看不懂

JavaScript其实之前是一直被误解的,因为它一直被当做是命令式式的编程语言,或许js爸爸Brendan Eich一开始设计的时候也是这样想的,但是其实js也是可以做函数式的编程。所谓函数式编程,其实不难,不同于后台强类型语言的面向对象式的编程语言,函数式编程是种编程范式,它将电脑运算视为函数的计算,强调计算。

函数式编程有以下特点:支持闭包和高阶函数,支持惰性计算(lazy evaluation)。使用递归作为控制流程的机制。加强了引用透明性。没有副作用。(这句话是百度的)

这本书主要介绍了函数式编程的一些规范,我只拿其中的简单几个概念作为例子

高阶函数: 高阶函数是可以把函数作为参数(如传递一个方法作为参数),或者说是可以把函数作为返回值的函数(其实就是return一个函数)

偏函数: 偏函数是指通过部分参数来产生一个新的定制的函数的方式,这种就叫做偏函数

纯函数: 书中的定义是这样的,纯函数是这样一种函数,即相同的输入,永远会得到相同的输出,而且没有任何可观察的副作用。其实最重要的就是这句话,相同的输入总会的得到相同的输出,纯函数的纯就在这一点,不过多的对函数之外的环境产生依赖,保证函数本身的纯粹,从而达到纯的目的

函数柯里化:curry无法口述,用一个例子来解释

var add = function(x) {
    return function(y) {
        return x + y;
    };
};
var increment = add(1);
var addTen = add(10);
increment(2);
// 3
addTen(2); 

这里我们定义了一个 add 函数,它接受一个参数并返回一个新的函数。调用add 之后,返回的函数就通过闭包的方式记住了 add 的第一个参数。一次性地调用它实在是有点繁琐,好在我们可以使用一个特殊的 curry 帮助函数(helperfunction)使这类函数的定义和调用更加容易。


异步编程

异步编程的优势和难点

node的异步编程所带来的最大优势就是基于事件驱动的非阻塞IO模型。非阻塞IO可以是CPU和IO操作并不相互依赖等待,让资源得以更好地利用。对于一些网络应用而言,并行还可以带来的优势是分布式和云。

但同时,node所带来的难点还是很困难的:

难点1: 异常处理 异步中的异常都是这个尿性,看下jquery的ajax就知道,所以在编写异步方法时,需要将异常正确的返回给用户的回调方法

难点2: 函数嵌套过深 回调地狱,不解释,但是现在有Promise,接下来会说

难点3: 阻塞代码 单线程的缺点,谨慎处理

难点4: 多线程编程 还是单线程所带来的问题,不过node有自己child_process

难点5: 异步转同步
这个就是node用惯了异步,但是没有同步操作的API,所以可能在实现同步的时候要去借助第三方库,不过放心,npm上面的插件肯定很多


异步编程的解决方案

关于异步编程的解决方案,书中给出了四种,分别是事件发布/订阅模式、Promise/Deferred、流程控制库、异步并发控制

事件发布/订阅模式: 这个就是设计模式中的一个概念,node中的event模块其实是一个很好地实践

Promise/Deferred: 强调事件的状态和目标,根据状态来执行,从而避免深度嵌套,这个es6中的Promise也已经有了很好地实现

流程控制库:流程控制的一个重要的概念就是尾触发,es6对这个有个比较好的实现,那就是终止函数,在es7的草案中,更是直接使用了await作为流程控制中止函数标识

异步并发控制: 考虑到异步操作对内存的影响,为避免cpu挂掉,所以要对异步的并发进行控制

扩展:

既然说到了流程控制,就不得不说现在最流行的两个前端框架,Expresskoa

Express是一个老牌的web应用框架了,Express 是一个基于 Node.js 平台的极简、灵活的 web 应用开发框架,它提供一系列强大的特性,帮助你创建各种 Web 和移动设备应用。
具体移步官网看,官网:http://www.expressjs.com.cn/

koa是新一种的前端框架,koa 是由 Express 原班人马打造的,致力于成为一个更小、更富有表现力、更健壮的 Web 框架。使用 koa 编写 web 应用,通过组合不同的 generator,可以免除重复繁琐的回调函数嵌套,并极大地提升错误处理的效率。koa 不在内核方法中绑定任何中间件,它仅仅提供了一个轻量优雅的函数库,使得编写 Web 应用变得得心应手。koa低层的实现依赖TJ大神的CO,库很小巧,暂时不深入,具体移步官网,官网:http://koa.bootcss.com/


前端新手,弱鸡一枚,如有错误,请指正,谢谢!

### 回答1: Node.js是一个基于Chrome V8引擎的JavaScript运行时环境,通过它可以使用JavaScript开发服务器端应用程序。Node.js的设计初衷是解决传统的后端开发中瓶颈问题,如高并发、I/O密集以及复杂的数据处理等。 Node.js拥有非阻塞式I/O与事件驱动的特点,这使得在处理大量并发连接时表现出色。与传统的多线程服务器相比,Node.js的单线程事件循环机制能够更高效地利用CPU和内存资源,并且能够处理更多的并发请求。 通过使用Node.js,开发者可以使用JavaScript语言进行全栈式开发,避免了前后端技术栈的差异性,提高了开发效率。Node.js的模块化机制使得使用第三方模块更加方便和灵活,有助于代码的复用和维护。 在图灵中,我们可以通过学习Node.js来掌握以下几个核心概念: 1. 事件驱动与异步编程Node.js利用事件循环机制实现异步非阻塞I/O,通过回调函数实现事件的处理。理解事件驱动的编程思维,能够使开发者更好地处理高并发情况下的请求。 2. HTTP服务器与路由:Node.js提供了HTTP模块,可以搭建自己的Web服务器,并实现路由功能。学习如何创建HTTP服务器和处理请求,能够让我们更好地理解Web开发的原理。 3. NPM与模块化开发:NPM是Node.js的包管理工具,可以方便地安装和管理第三方模块。学习NPM的使用,了解模块化开发的概念和实践,能够更好地管理项目的依赖和提高代码复用性。 4. 文件系统与流操作:Node.js可以轻松地进行文件的读写和操作,通过流的方式进行数据的传输和处理,提高了大数据量的处理效率。 5. Express框架与数据库操作:ExpressNode.js的Web应用程序框架,可以简化Web开发的过程。同时,Node.js也支持各种数据库的操作,学习如何使用Express框架和操作数据库,能够更好地构建实际的应用程序。 通过深入浅出学习Node.js,我们可以全面掌握JavaScript在服务器端的应用,提升自己的全栈开发能力,能够更好地应对日益复杂的网络开发需求。 ### 回答2: 深入浅出node.js图灵是指以易于理解和掌握的方式介绍node.js这个开发平台。Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它主要用于服务器端编程,可以构建高性能的网络应用。 深入浅出的意思是通过简单明了的解释和示例来讲解node.js的关键概念和用法,使初学者能够迅速上手。在深入方面,不仅仅是讲解语法和API,还涉及到node.js的设计原理和性能优化等方面的知识。在浅出方面,避免过多的技术术语和复杂的概念,注重引导读者理解核心的思想和模式。 在node.js图灵的学习中,可能会包含以下内容: 1. Node.js的安装和配置:介绍如何下载、安装和配置Node.js的运行环境。 2. JavaScript快速回顾:回顾JavaScript的基本语法和用法,为后续的Node.js开发做准备。 3. 模块和包管理:讲解Node.js的模块系统和npm包管理器,了解如何使用、创建和发布模块和包。 4. 异步编程:深入理解Node.js的事件驱动和非阻塞I/O模型,学习如何编写异步代码以提高系统的性能和可伸缩性。 5. HTTP和网络编程:探索Node.js在网络编程中的应用,如创建HTTP服务器、发送和接收HTTP请求等。 6. 数据库和存储:介绍如何使用Node.js操作数据库,如MySQL、MongoDB等,以及文件系统的读写操作。 7. Web框架和中间件:学习常用的Node.js Web框架,如Express.js,以及如何使用中间件来处理请求和响应。 8. 调试和优化:掌握Node.js的调试技巧和性能优化策略,以提高应用的稳定性和效率。 通过深入浅出node.js图灵的学习,可以快速掌握Node.js的基本概念和用法,并能够使用Node.js构建高性能的网络应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值