前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Node.js基础 23456:全局对象,回调函数,模块,事件,读写文件(同步,异步)

Node.js基础 23456:全局对象,回调函数,模块,事件,读写文件(同步,异步)

作者头像
代码之风
发布于 2019-03-20 02:56:51
发布于 2019-03-20 02:56:51
1.7K00
代码可运行
举报
文章被收录于专栏:马涛涛的专栏马涛涛的专栏
运行总次数:0
代码可运行

全局对象

类似的,在浏览器中有window 全局变量在所有模块中都可使用。不需要引用等。 全局变量console,setTimeout,require()

全局变量在所有模块中都可使用。 以下变量虽然看起来像全局变量,但实际上不是(global里面没有以下属性)。 它们的作用域只在模块内,详见 文档:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
__dirname
__filename
exports
module
require()

回调函数

与js一样,如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function callFunction(fun, name) {
    fun(name);
}

callFunction(function(name) {
    console.log(name + ' Bye');
}, 'mtt');

模块

一个大项目一定是分成一个个模块的,一般来说,一个文件就是一个模块。 模块使用方法:

向外暴露的是一个对象。

我们require()的时候,接收的也是一个对象. 所以也可以这样写:

app.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var stuff = require('./count');



console.log(stuff.counter(['ruby', 'nodejs', 'react']));
console.log(stuff.adder(3));//6.14

可以使用别的模块里的变量(闭包) count.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var adder = function(a) {
    return `the sum of the 2 numbers is ${a+pi}`;
}

var pi = 3.14;

module.exports = {
    counter: function(arr) {
        return "There are " + arr.length + " elements in the array";
    },
    adder: adder
}

事件

http://nodejs.cn/api/events.html

大多数 Node.js 核心 API 构建于惯用的异步事件驱动架构,其中某些类型的对象(又称触发器,Emitter)会触发命名事件来调用函数(又称监听器,Listener)。例如,net.Server 会在每次有新连接时触发事件,fs.ReadStream会在打开文件时触发事件,stream会在数据可读时触发事件。 所有能触发事件的对象都是 EventEmitter 类的实例。 这些对象有一个 eventEmitter.on() 函数,用于将一个或多个函数绑定到命名事件上。 事件的命名通常是驼峰式的字符串。 当 EventEmitter 对象触发一个事件时,所有绑定在该事件上的函数都会被同步地调用。

例子,一个简单的 EventEmitter 实例,绑定了一个监听器。 eventEmitter.on() 用于注册监听器,eventEmitter.emit() 用于触发事件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
  console.log('触发事件');
});
myEmitter.emit('event');

总结理解:

  1. 触发器(Emitter)会触发监听器(Listener),然后函数会被同步调用。
  2. myEmitter.on('event', () => {});用来 绑定事件与函数(注册监听器,eventEmitter.emit() 用于触发事件
  3. 例子:net.Server 会在每次有新连接时触发事件,fs.ReadStream会在打开文件时触发事件,stream会在数据可读时触发事件。

传参数与 this 到监听器

http://nodejs.cn/api/events.h...

eventEmitter.emit() 方法可以传任意数量的参数到监听器函数。 当监听器函数被调用时,this 关键词会被指向监听器所绑定的EventEmitter 实例。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const EventEmitter = require('events');
class MyEmitter extends EventEmitter{}
const myEmitter1 = new MyEmitter();
myEmitter1.on('exxx',function (a, b) {
    console.log(a, b, this, this===myEmitter1);
})


myEmitter1.emit('exxx','我是a','我是b')

总结:

  1. eventEmitter.emit() 从第二个参数开始,会把参数传到监听器绑定的那个函数里面,作为第一个开始.
  2. this代表调用on的那个实例

事件只处理一次

当使用 eventEmitter.on() 注册监听器时,监听器会在每次触发命名事件时被调用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const myEmitter = new MyEmitter();
let m = 0;
myEmitter.on('event', () => {
  console.log(++m);
});
myEmitter.emit('event');
// 打印: 1
myEmitter.emit('event');
// 打印: 2

使用 eventEmitter.once() 可以注册最多可调用一次的监听器。 当事件被触发时,监听器会被注销,然后再调用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const myEmitter = new MyEmitter();
let m = 0;
myEmitter.once('event', () => {
  console.log(++m);
});
myEmitter.emit('event');
// 打印: 1
myEmitter.emit('event');
// 不触发

evnets是核心库,直接require('events') 手动用代码触发事件。 util(实用工具)(nodejs核心工具库) http://nodejs.cn/api/util.htm...

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var events = require('events');
var util = require('util');//nodejs工具库

var Person = function(name) {
    this.name = name
}

util.inherits(Person, events.EventEmitter);
//让Person继承events.EventEmitter(也可以用ES6写法的extends关键字),让他拥有可以绑定事件,触发事件的功能。
var xiaoming = new Person('xiaoming');
var lili = new Person('lili');
var lucy = new Person('lucy');
//新生成三个对象
var person = [xiaoming, lili, lucy];

person.forEach(function(person) {
    person.on('speak', function(message) {
        console.log(person.name + " said: " + message);//给每一个新对象绑定事件
    })
})

xiaoming.emit('speak', 'hi');//每一个新对象都可以触发事件
lucy.emit('speak', 'I want a curry');

读写文件(同步,异步)

文件系统http://nodejs.cn/api/fs.html fs 模块用于以一种类似标准 POSIX 函数的方式与文件系统进行交互。

使用方法如下:

const fs = require('fs'); 所有的文件系统操作都有同步异步两种形式。

异步

异步形式的最后一个参数是完成时的回调函数。 传给回调函数的参数取决于具体方法,但第一个参数会保留给异常。 如果操作成功完成,则第一个参数(异常)会是 nullundefined

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const fs = require('fs');

fs.unlink('/tmp/hello', (err) => {
  if (err) throw err;
  console.log('成功删除 /tmp/hello');
});

同步

当使用同步操作时,任何异常都会立即抛出,可以使用 try/catch 处理异常。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const fs = require('fs');

try {
  fs.unlinkSync('/tmp/hello');
  console.log('成功删除 /tmp/hello');
} catch (err) {
  // 处理异常。
}

同步异步注意

异步的方法不能保证执行顺序。 所以下面的例子可能会出错,因为 fs.stat() 可能在 fs.rename() 之前完成:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fs.rename('/tmp/hello', '/tmp/world', (err) => {
  if (err) throw err;
  console.log('重命名完成');
});
fs.stat('/tmp/world', (err, stats) => {
  if (err) throw err;
  console.log(`文件属性: ${JSON.stringify(stats)}`);
});
要想按顺序执行操作,需要把 fs.stat() 放到 fs.rename() 的回调函数中:

fs.rename('/tmp/hello', '/tmp/world', (err) => {
  if (err) throw err;
  fs.stat('/tmp/world', (err, stats) => {
    if (err) throw err;
    console.log(`文件属性: ${JSON.stringify(stats)}`);
  });
});
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Node入门教程(10)第八章:Node 的事件处理
Node中大量运用了事件回调,所以Node对事件做了单独的封装。所有能触发事件的对象都是 EventEmitter 类的实例,所以上一篇我们提到的文件操作的可读流、可写流等都是继承了 EventEmitter。当然我们也可以自定义具有事件行为的自定义对象,仅需要对其继承即可。 继承EventEmitter node的events模块封装了EventEmitter类型,此类型里面封装了事件注册、触发等API。 // 引入events模块 const EventEmitter = require('events
老马
2018/04/16
8180
Node.js中的EventEmitter模块:基本概念、使用方法和常见应用场景
Node.js是一个基于事件驱动的JavaScript运行时环境,广泛用于服务器端开发。Node.js内置了一个强大的事件模块,称为EventEmitter。EventEmitter提供了一种处理事件和实现自定义事件的能力。
网络技术联盟站
2023/07/07
1.2K0
Node.js 回调函数和事件循环
1. node.js 回调函数 node.js 的异步编程思想最直接的体现就是回调,在node中大量使用了回调函数,所有的API都支持回调函数,回调函数一般作为最后一个参数出现,正因为这样node在执行代码的时候就没有阻塞或者等待的操作,提高了node的性能,可以处理大量的并发请求。 function f1(name, age, callback){} function f2(name, callback, callback2){} 阻塞代码实例 创建一个文件input.txt内容如下: 这是一个阻
执行上下文
2022/07/26
3.1K0
Node.js 回调函数和事件循环
node.js 事件循环
  node.js是单线程的应用程序,但是他可能通过event和callback来支持并发。所有的node.js都是单线程的,也是异步的,他们使用调用异步函数来维持高并发。Node使用观察者模式。Node的线程会保持一个事件循环,当有任务完成时,他会触发相应的事件,通知事件监听函数执行。      事件驱动程序      node.js大量的使用事件,这也是和其他相同技术相比更快的原因。当Node被启动时,初始他的变量,和声明方法,而后等待事件的发生。      在一个事件驱动应用程序内,一般会有一个主要的
lpxxn
2018/01/31
3.1K0
node.js  事件循环
深入学习 Node.js EventEmitter
观察者模式,它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使得它们能够自动更新自己。
阿宝哥
2019/11/06
1.1K0
深入学习 Node.js EventEmitter
NodeJS知识点梳理-第一篇
或者我们直接运行一个我们本地的js也是一样的,直接node csdn_demo.js
何处锦绣不灰堆
2020/05/28
1.1K0
Node.js 事件循环
Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。
陈不成i
2021/07/09
3.5K0
Node.js EventEmitter(下)
从指定监听器数组中删除一个监听器。需要注意的是,此操作将会改变处于被删监听器之后的那些监听器的索引。
陈不成i
2021/07/09
3700
这里有一份Node.js入门指南和实践,请注意查收
JS 是脚本语言,脚本语言都需要一个解析器才能运行。对于写在 HTML 页面里的 JS,浏览器充当了解析器的角色。而对于需要独立运行的 JS,NodeJS 就是一个解析器。
null仔
2020/02/28
3.7K0
这里有一份Node.js入门指南和实践,请注意查收
Node.JS 学习记录(02)
Node.js 里面的许多对象都会分发事件:一个 net.Server 对象会在每次有新连接时触发一个事件, 一个 fs.readStream 对象会在文件被打开的时候触发一个事件。 所有这些产生事件的对象都是 events.EventEmitter 的实例。 EventEmitter 类 events 模块只提供了一个对象: events.EventEmitter。EventEmitter 的核心就是事件触发与事件监听器功能的封装。 你可以通过require(“events”);来访问该模块。
王也518
2022/10/26
7350
Node.js快速入门
下载最新版源码:https://nodejs.org/dist/v6.9.5/node-v6.9.5.tar.gz
程裕强
2022/05/06
11.5K0
Node.js EventEmitter 和 Buffer
EventEmitter对象如果在实例化的时候发生错误,将会触发 error 事件。当添加新的监听器的时候,newListener事件会被触发,当该监听器被移除的时候,removeListener 将会被触发。
执行上下文
2022/07/26
1.5K0
Node.js 知名框架 Express Koa 都在使用的 Events 模块你了解吗?
在 Node.js 中一个很重要的模块 Events(EventEmitter 事件触发器),也称为发布/订阅模式,为什么说它重要,因为在 Node.js 中绝大多数模块都依赖于此,例如 Net、HTTP、FS、Stream 等,除了这些系统模块比较知名的 Express、Koa 框架中也能看到 EventEmitter 的踪迹。
五月君
2019/11/06
2.1K0
[源码解读]一文彻底搞懂Events模块
发布/订阅者模式应该是我在开发过程中遇到的最多的设计模式。发布/订阅者模式,也可以称之为消息机制,定义了一种依赖关系,这种依赖关系可以理解为 1对N (注意:不一定是1对多,有时候也会1对1哦),观察者们同时监听某一个对象相应的状态变换,一旦变化则通知到所有观察者,从而触发观察者相应的事件,该设计模式解决了主体对象与观察者之间功能的 耦合。
coder_koala
2019/09/05
8980
[源码解读]一文彻底搞懂Events模块
Node.js 基础入门
Node.js 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境
王秀龙
2021/08/23
1.5K0
Node.js 基础入门
Node.js处理异步的方式
Node.js以异步著称,性能非常的好,但是在开发过程中我们时常要规避一些异步执行,要让程序按同步执行,如下的代码可以说明存在的问题。
越陌度阡
2020/11/26
1.3K0
Node事件循环之EventEmitter
Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列,Node.js 里面的许多对象都会触发分发事件:一个 net.Server 对象会在每次有新连接时触发一个事件, 一个 fs.readStream 对象会在文件被打开的时候触发一个事件。 所有这些产生事件的对象都是 events.EventEmitter 的实例。
xiangzhihong
2022/11/30
3840
Node.js 的 EventEmitter 事件处理详解
在本教程中我们学习 Node.js 的原生 EvenEmitter 类。学完后你将了解事件、怎样使用 EvenEmitter 以及如何在程序中利用事件。另外还会学习 EventEmitter 类从其他本地模块扩展的内容,并通过一些例子了解背后的原理。
疯狂的技术宅
2020/11/03
1.7K0
node工具模块
因为计算机读取的时候是从低电位进行读取,计算的时候也是从低位进行计算(人类也是这样)这样的效率一般会比较高。
mySoul
2018/07/28
5960
nodejs事件和事件循环简介
熟悉javascript的朋友应该都使用过事件,比如鼠标的移动,鼠标的点击,键盘的输入等等。我们在javascript中监听这些事件,从而触发相应的处理。
程序那些事
2020/12/14
8250
相关推荐
Node入门教程(10)第八章:Node 的事件处理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档