node.js学习笔记——回调函数

李某龙      2022-02-09     290

关键词:

  Node.js 异步编程的直接体现就是回调。

  那什么是回调呢?回调指的是将一个函数作为参数传递给另一个函数,并且通常在第一个函数完成后被调用。需要指明的是,回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。回调函数在完成任务后就会被调用,Node 使用了大量的回调函数,Node 所有 API 都支持回调函数。例如,我们可以一边读取文件,一边执行其他命令,在文件读取完成后,我们将文件内容作为回调函数的参数返回。这样在执行代码时就没有阻塞或等待文件 I/O 操作。这就大大提高了 Node.js 的性能,可以处理大量的并发请求。

  虽然异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了。

  

  在开始下面的内容之前,我们需要先了解几个概念:

  什么是阻塞:

    所谓阻塞,即每次执行一个操作,在一个操作完成之前,代码的执行会被暂停,无法继续下一个操作。

  什么是非阻塞:

    所谓非阻塞,指的是基于回调、允许脚本并行执行操作的方法,操作结果会在事件发生时由回调来处理,从而无需等待某个操作的结果继续下一步。

 

  举个栗子解释一下阻塞和非阻塞的区别:

  你在家里做饭,结果发现家里没酱油了,所以你就停下手上的活跑去商店买酱油。结果店员告诉你说现在没酱油了,采购员正在外面采购,需要等一下才回来。这时候你就有两个选择:一是继续在商店里等采购员回来,拿到酱油回家继续做菜;二是先回家忙其他的活,等一下再回来买酱油。   

  第一个选择其实就是阻塞的做法,需要等到酱油买到之后才继续其他的事。第二个选择就是非阻塞的做法,先去做其他的事,等到合适的时候再去买酱油。(当然,这栗子有点不靠谱。希望大家能看懂我的意思。)

 

  实践出真知,讲完基础的知识点,那就开始敲一下代码吧。撸起袖子就是干。

  现在这里过一下下面实例会使用到的API:

  

  读取文件(同步操作):fs.readFileSync(file[, options])

  

  读取文件(异步操作):fs.readFile(file[, options], callback)

 

 

  阻塞代码实例

  先新建一个txt文件,比如demo2.txt。然后在里面随便敲一点东西,比如:

******   this is my second demo!   ******

  然后再在同个目录下新建一个js脚本,我把它取名为demo2.js,代码如下:

//引入fs(filesystem)模块,在脚本使用
var fs = require("fs");
//同步读取文件
var data = fs.readFileSync('demo2.txt');
//打印数据
console.log(data.toString());
console.log("------   程序执行结束!   ------");

   最后就可以使用node指令运行我们的代码了!是不是很心急,那就来看看吧。

//node指令
node demo2.js

  cmd运行效果:

  可以看到,js脚本读取完文件并输出文件内容之后,才会继续执行下面的console.log("------ 程序执行结束! ------")。由于读取文件和输出内容需要时间,在读取和输出的过程中脚本并不会先去执行其他代码,而是要等到读取并输出文件内容完成之后才会接着去进行下一步操作。这就是所谓的(同步)阻塞。

 

  非阻塞代码实例

  demo2.txt仍跟之前的一样。我们只要修改demo.js代码就行,具体代码如下:

//引入fs(filesystem)模块,在脚本使用
var
fs = require("fs"); //异步读取文件 fs.readFile('demo2.txt', function (err, data) { if (err) return console.error(err); //若读取失败,则报出错误 console.log(data.toString()); //读取成功则输出文件内容 }); console.log("程序执行结束!");

  来看看运行效果:

  可以看到,由于使用了异步读取操作,所以在读取文件的时候,脚本会继续执行下面的代码,也就是说,不管文件是否读取并输出完毕,脚本都会往下执行。所以就会看到先执行完console.log("------ 程序执行结束! ------")之后才看到输出"******   this is my second demo!   ******"。这就是所谓的(异步)非阻塞。

  

  以上两个实例我们了解了阻塞与非阻塞调用的不同。第一个实例在文件读取完后才执行完程序。 第二个实例我们不需要等待文件读取完,这样就可以在读取文件时同时执行接下来的代码,大大提高了程序的性能。

因此,阻塞是按顺序执行的,而非阻塞是不需要按顺序的,所以如果需要处理回调函数的参数,我们就需要写在回调函数内。

  

  你们看懂了吗?反正我是懂了(~ ̄▽ ̄)~

 

文件系统(node.js学习笔记)

根据nodejs菜鸟教程整理。官方API文档:nodeJS文件系统API其他整理:nodejsFileSystem文件系统操作函数分类1、引用:导入文件系统模块(fs)语句:varfs=require("fs")2、异步与同步:异步:fs.readFile();  第一个参数为回调error信息。同... 查看详情

node-学习笔记

什么是Node.js1)Node.js是一个基于ChromeV8引擎的JavaScript运行环境2)Node.js使用了一个事件驱动、非阻塞式I/O的模型,使其轻量又高效。   ①事件驱动:当触发某个事件的时候,执行事件中指定的代码。   ②非... 查看详情

node.js学习笔记之调用函数

本文件和从其它模块引入函数;从其他模块引入分只支持引入一个函数和多个 这两种例:test.js为主函数varhttp=require(‘http‘);http.createServer(function(request,response){response.writeHead(200,{‘Content-Type‘:‘text/html‘})func1(response);//调用... 查看详情

所有 Node.js 回调函数都是异步的吗?

...onous?【发布时间】:2014-03-2000:08:44【问题描述】:我正在学习Node.js,我在每个教程中听到的都是“Node是异步且无阻塞的!”我听说在常规浏览器JavaScript中只有某些东西,例如AJAX调用可以异步或非阻塞(使用回调)......Node.js也... 查看详情

node.js回调函数

Node.js回调函数Node.js异步编程的直接体现就是回调。异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了。回调函数在完成任务后就会被调用,Node使用了大量的回调函数,Node所有API都支持回调函数。例如,我们... 查看详情

node.js回调函数

...enttoanotherfunctionandisexecutedafteritsparentfunctionhascompleted.Node.js回调函数Node.js异步编程的直接体现就是回调。异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了。回调函数在完成任务后就会被 查看详情

nodejs学习笔记

HelloFuck如下:console.log(‘Hello,Fuckyou,NodeJs‘);#nodeHelloworld.jsHello,Fuckyou,NodeJs事件:Node.js所有的异步i/o操作在完成时都会发送一个事件到事件队列,事件由EventEmitter对象来提供,前面提到的fs.readFile和http.createServer的回调函数都是通... 查看详情

node.js回调函数

Node.js异步编程的直接体现就是回调。异步编程依托于回调来实现,但是不能说使用了回调后程序就异步话了,回调函数在完成任务之后会被调用,Node使用了大量的回调函数,Node所以的API都是支持回调函数的。如下是阻塞和非阻... 查看详情

node.js回调函数

Node.js异步编程的直接体现就是回调。异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了。回调函数在完成任务后就会被调用,Node使用了大量的回调函数,Node所有API都支持回调函数。例如,我们可以一边读取文... 查看详情

创业笔记-node.js入门之基于事件驱动的回调

基于事件驱动的回调这个问题可不好回答(至少对我来说),不过这是Node.js原生的工作方式。它是事件驱动的,这也是它为什么这么快的原因。你也许会想花点时间读一下FelixGeisendörfer的大作Understandingnode.js,它介绍了一些... 查看详情

系列文章--node.js学习笔记系列

Node.js学习笔记系列总索引Nodejs学习笔记(一)---简介及安装Node.js开发环境Nodejs学习笔记(二)---事件模块Nodejs学习笔记(三)---模块Nodejs学习笔记(四)---与MySQL交互(felixge/node-mysql)Nodejs学习笔记(五)---Express安装入门与模... 查看详情

node.js回调函数事件机制(eventemitter类)全局对象(代码片段)

目录Node.js的回调函数什么是回调函数回调函数示例Node.js的事件机制EventEmitter类的各种方法示例:EventEmitter类的on方法Node.js的全局对象process对象process事件Node.js的回调函数什么是回调函数回调函数指的就是一个函数A作为参数... 查看详情

回调函数(callback)学习笔记

1.stackoverflow上大神的描述(浏览的网页没记住):  A"callback"isanyfunctionthatiscalledbyanotherfunctionwhichtakesthefirstfunctionasaparameter.2.看了几天的介绍,自己关于回调的简单理解:  1)为了干成某件事,自己建立模块A,然后在A里有... 查看详情

回调函数

node.js回调函数Node.js异步编程的直接体现就是回调。异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了。回调函数在完成任务后就会被调用,Node使用了大量的回调函数,Node所有API都支持回调函数。例如,我们... 查看详情

node.js学习

回调函数处理并发。Sync同步;vardata=fs.readFileSync(‘input.txt‘);console.log(data.toString());fs.readFile(‘input.txt‘,function(err,data){if(err)returnconsole.error(err);console.log(data.toString());});阻塞是按顺序执行的,而 查看详情

node.js 在执行'n'异步回调后执行函数

】node.js在执行\\\'n\\\'异步回调后执行函数【英文标题】:node.jsexecutefunctionafter\'n\'asynccallbackareexecutednode.js在执行\'n\'异步回调后执行函数【发布时间】:2013-02-0203:11:42【问题描述】:我不知道如何在\'n\'异步函数执行后执行回调... 查看详情

node.js插件编写-普通函数和回调函数的实现

...一个复杂一点的插件,通过Node-Api实现插件导出普通函数和回调函数。环境安装 安装bindings依赖 以及node-addon-api 依赖 相关package.json文件内容如下 "name":"my-node-addon","version":"0.0.0", 查看详情

Node.js - 如何使用回调调用异步函数?

】Node.js-如何使用回调调用异步函数?【英文标题】:Node.js-Howdoyoucallanasyncfunctionwithacallback?【发布时间】:2020-06-0410:41:12【问题描述】:下面的async函数应该检查一个url是否是一个合法的urlletCheckUrl=function(url,done)dns.lookup(url,functio... 查看详情