资讯专栏INFORMATION COLUMN

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

RobinTang / 286人阅读

摘要:它们的作用域只在模块内,详见文档回调函数与一样,如模块一个大项目一定是分成一个个模块的,一般来说,一个文件就是一个模块。这些对象有一个函数,用于将一个或多个函数绑定到命名事件上。用于注册监听器,用于触发事件。

全局对象

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

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

__dirname
__filename
exports
module
require()
回调函数

与js一样,如:

function callFunction(fun, name) {
    fun(name);
}

callFunction(function(name) {
    console.log(name + " Bye");
}, "mtt");
模块

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

向外暴露的是一个对象。

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


app.js

var stuff = require("./count");



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

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

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() 用于触发事件。

const EventEmitter = require("events");

class MyEmitter extends EventEmitter {}

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

总结理解:

触发器(Emitter)会触发监听器(Listener),然后函数会被同步调用。

myEmitter.on("event", () => {});用来 绑定事件与函数(注册监听器,eventEmitter.emit() 用于触发事件

例子:net.Server 会在每次有新连接时触发事件,fs.ReadStream会在打开文件时触发事件,stream会在数据可读时触发事件。

传参数与 this 到监听器

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

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


总结:

eventEmitter.emit() 从第二个参数开始,会把参数传到监听器绑定的那个函数里面,作为第一个开始.

this代表调用on的那个实例

事件只处理一次

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

const myEmitter = new MyEmitter();
let m = 0;
myEmitter.on("event", () => {
  console.log(++m);
});
myEmitter.emit("event");
// 打印: 1
myEmitter.emit("event");
// 打印: 2

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

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...

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

const fs = require("fs");

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

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

const fs = require("fs");

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

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

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)}`);
  });
});

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/102485.html

相关文章

  • Node.js知识点详解(一)基础部分

    摘要:基础的端到端的基准测试显示大约比快八倍。所谓单线程,就是指一次只能完成一件任务。在服务器端,异步模式甚至是唯一的模式,因为执行环境是单线程的,如果允许同步执行所有请求,服务器性能会急剧下降,很快就会失去响应。 模块 Node.js 提供了exports 和 require 两个对象,其中 exports 是模块公开的接口,require 用于从外部获取一个模块的接口,即所获取模块的 e...

    whjin 评论0 收藏0
  • 后端知识点总结——NODE.JS(高级)

    摘要:阶段是事件循环的第一阶段习惯上往往都会设置数将回调函数添加到事件循环的阶段的队列中等待执行。 后端知识点总结——NODE.JS(高级) 1.Node入门: 什么是: 针对网络应用开发的平台主要特征: 基于Google的JavaScript运行时引擎V8 扩展了Node标准类库: TCP,同步或异步文件管理,HTTP 为什么使用Node: 可以在服务器端运行js: 现有前端团队可直...

    bovenson 评论0 收藏0
  • Node.js设计模式》Node.js基本模式

    摘要:回调函数是在异步操作完成后传播其操作结果的函数,总是用来替代同步操作的返回指令。下面的图片显示了中事件循环过程当异步操作完成时,执行权就会交给这个异步操作开始的地方,即回调函数。 本系列文章为《Node.js Design Patterns Second Edition》的原文翻译和读书笔记,在GitHub连载更新,同步翻译版链接。 欢迎关注我的专栏,之后的博文将在专栏同步: Enc...

    Seay 评论0 收藏0
  • Node.js 学习笔记(三)

    摘要:在浏览器中的全局对象是对象。程序是由事件驱动执行的单线程模型,也不例外。不断执行响应事件的函数,直到没有任何响应事件的函数可以执行,就退出了。方法此方法可以在下一次事件响应中执行代码。它会返回一个对象,告诉我们文件的详细信息。 global JS在浏览器中的全局对象是window对象。在Node.js环境中,全局对象则叫global。我们可以用它来区分当前JavaScript的执行环境...

    sorra 评论0 收藏0
  • Node_深入浅出Node

    摘要:简介项目命名为就是一个服务器单纯开发一个服务器的想法,变成构建网络应用的一个基本框架发展为一个强制不共享任何资源的单线程,单进程系统。单线程弱点无法利用多核错误会引起整个应用退出,应用的健壮性大量计算占用导致无法继续调用异步。 NodeJs简介 Ryan Dahl项目命名为:web.js 就是一个Web服务器.单纯开发一个Web服务器的想法,变成构建网络应用的一个基本框架.Node发展...

    shinezejian 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<