Nodejs Guides(四)

EVENTS

events模块API实例 

const EventEmitter = require('events');class MyEmitter extends EventEmitter {
}
//EventListener 会按照监听器注册的顺序同步地调用所有监听器。
//所以需要确保事件的正确排序且避免竞争条件或逻辑错误。
//监听器函数可以使用 setImmediate() 或 process.nextTick() 方法切换到异步操作模式:
const myEmitter = new MyEmitter();
myEmitter.on('event', (a, b) => {setImmediate(() => {console.log('这个是异步发生的');});
});
myEmitter.on('event1', () => {console.log('触发了一个事件1!');
});
myEmitter.on('event2', () => {console.log('触发了一个事件2!');
});
//eventEmitter.once() 方法时可以注册一个对于特定事件最多被调用一次的监听器。 当事件被触发时,监听器会被注销,然后再调用。
let m = 0;
myEmitter.once('event3', () => {console.log(++m);
});
//当EventEmitter 实例中发生错误时,会触发一个 'error' 事件。 这在 Node.js 中是特殊情况。
//最佳实践,应该始终为 'error' 事件注册监听器。
myEmitter.on('error', (err) => {console.error('有错误');
});
//emitter.prependListener() 方法可用于将事件监听器添加到监听器数组的开头。
myEmitter.prependListener('event', () => console.log('b'));
//添加一个单次 listener 函数到名为 eventName 的事件的监听器数组的开头。 下次触发 eventName 事件时,监听器会被移除,然后调用。
myEmitter.prependOnceListener('event', (stream) => {console.log('c');
});
myEmitter.emit('error', new Error('whoops!'));
myEmitter.emit('event3');
myEmitter.emit('event3');
myEmitter.emit('event');
myEmitter.emit('event2');
myEmitter.emit('event1');
myEmitter.emit('event');
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();//this指向MyEmitter
// myEmitter.on('event', function (a, b) {
//     console.log(a, b, this);
// });//this指向空对象
myEmitter.on('event', (a, b) => {console.log(a, b, this);// 打印: a b {}
});myEmitter.emit('event', 'a', 'b');
const EventEmitter = require('events');class MyEmitter extends EventEmitter {
}const myEmitter = new MyEmitter();
// 当EventListener 所注册的事件发生的时候,该方法会被调用
myEmitter.once('newListener', (event, listener) => {if (event === 'event') {// 在开头插入一个新的监听器myEmitter.on('event', () => {console.log('B');});}
});
myEmitter.on('event', () => {console.log('A');
});
myEmitter.emit('event');
myEmitter.emit('event');
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {
}
const myEmitter = new MyEmitter();
// 在事件触发后、最后一个监听器完成执行后,从名为 eventName 的事件的监听器数组中移除指定的 listener。
const callbackA = () => {console.log('A');myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {console.log('B');
};
myEmitter.on('event', callbackA);myEmitter.on('event', callbackB);myEmitter.emit('event');
myEmitter.emit('event');

URL

WHATWG URL API实例

const {URL} = require('url');
const myURL1 =new URL('https://abc:xyz@example.com');
console.log(myURL1);const myURL2 = new URL('/foo', 'https://example.org/');
console.log(myURL2);const myURL3 = new URL('https://example.org/abc?asd=abc');
console.log(myURL3.searchParams);const myURLs = [new URL('https://www.example.com'),new URL('https://test.example.org')
];
console.log(JSON.stringify(myURLs));// ┌─────────────────────────────────────────────────────────────────────────────────────────────┐
// │                                            href                                             │
// ├──────────┬──┬─────────────────────┬─────────────────────┬───────────────────────────┬───────┤
// │ protocol │  │        auth         │        host         │           path            │ hash  │
// │          │  │                     ├──────────────┬──────┼──────────┬────────────────┤       │
// │          │  │                     │   hostname   │ port │ pathname │     search     │       │
// │          │  │                     │              │      │          ├─┬──────────────┤       │
// │          │  │                     │              │      │          │ │    query     │       │
// "  https:   //    user   :   pass   @ sub.host.com : 8080   /p/a/t/h  ?  query=string   #hash "
// │          │  │          │          │   hostname   │ port │          │                │       │
// │          │  │          │          ├──────────────┴──────┤          │                │       │
// │ protocol │  │ username │ password │        host         │          │                │       │
// ├──────────┴──┼──────────┴──────────┼─────────────────────┤          │                │       │
// │   origin    │                     │       origin        │ pathname │     search     │ hash  │
// ├─────────────┴─────────────────────┴─────────────────────┴──────────┴────────────────┴───────┤
// │                                            href                                             │
// └─────────────────────────────────────────────────────────────────────────────────────────────┘
const {URL, URLSearchParams} = require('url');
const myURL = new URL('https://example.org/?abc=123');
console.log(myURL.searchParams.get('abc'));
myURL.searchParams.append('abc', 'xyz');
myURL.searchParams.delete('abc');
myURL.searchParams.set('a', 'b');
const newSearchParams = new URLSearchParams(myURL.searchParams);
newSearchParams.append('a', 'c');
myURL.search = newSearchParams;
console.log(myURL.href);
const {URL, URLSearchParams} = require('url');
const myURL = new URL('https://example.org/?abc=123');
console.log(myURL.searchParams.get('abc'));
myURL.searchParams.append('abc', 'xyz');
myURL.searchParams.delete('abc');
myURL.searchParams.set('a', 'b');
const newSearchParams = new URLSearchParams(myURL.searchParams);
newSearchParams.append('a', 'c');
myURL.search = newSearchParams;
console.log(myURL.href);
//在数组的形式中,重复的键是不允许的。
const params = new URLSearchParams({user: 'abc',query: ['first', 'second']
});
console.log(params.getAll('query'));
console.log(params.toString());//iterable <Iterable> 一个元素时键值对的迭代对象
let params;
// Using an array
params = new URLSearchParams([['user', 'abc'],['query', 'first'],['query', 'second']
]);
console.log(params.toString());
// 输出 'user=abc&query=first&query=second'// 使用Map对象
const map = new Map();
map.set('user', 'abc');
map.set('query', 'xyz');
params = new URLSearchParams(map);
console.log(params.toString());
// 输出 'user=abc&query=xyz'// 使用generator函数
function* getQueryPairs() {yield ['user', 'abc'];yield ['query', 'first'];yield ['query', 'second'];
}
params = new URLSearchParams(getQueryPairs());
console.log(params.toString());
// 输出 'user=abc&query=first&query=second'// 每个键值对必须有两个元素
new URLSearchParams([['user', 'abc', 'error']
]);
// 抛出 TypeError [ERR_INVALID_TUPLE]:
//        每一个键值对必须是迭代的[键,值]元组
//在数组的形式中,重复的键是不允许的。
const params = new URLSearchParams({user: 'abc',query: ['first', 'second']
});
console.log(params.getAll('query'));
console.log(params.toString());//iterable <Iterable> 一个元素时键值对的迭代对象
let params;
// Using an array
params = new URLSearchParams([['user', 'abc'],['query', 'first'],['query', 'second']
]);
console.log(params.toString());
// 输出 'user=abc&query=first&query=second'// 使用Map对象
const map = new Map();
map.set('user', 'abc');
map.set('query', 'xyz');
params = new URLSearchParams(map);
console.log(params.toString());
// 输出 'user=abc&query=xyz'// 使用generator函数
function* getQueryPairs() {yield ['user', 'abc'];yield ['query', 'first'];yield ['query', 'second'];
}
params = new URLSearchParams(getQueryPairs());
console.log(params.toString());
// 输出 'user=abc&query=first&query=second'// 每个键值对必须有两个元素
new URLSearchParams([['user', 'abc', 'error']
]);
// 抛出 TypeError [ERR_INVALID_TUPLE]:
// 每一个键值对必须是迭代的[键,值]元组

 

转载于:https://www.cnblogs.com/Merrys/p/8391199.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/284287.shtml

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

相关文章

[转]常用自动化测试工具

1、Appium 官网&#xff1a;http://appium.io AppUI自动化测试 Appium 是一个移动端自动化测试开源工具&#xff0c;支持iOS 和Android 平台&#xff0c;支持Python、Java 等语言&#xff0c;即同一套Java 或Python 脚本可以同时运行在iOS 和Android平台&#xff0c;Appium 是…

ABP学习资源整理

不同的编程语言都有构建Web Application的框架&#xff0c;比如C#中的ASP.NET Core和ABP&#xff0c;Java中的Spring Boot和Spring Cloud&#xff0c;Python中的Django和Flask&#xff0c;Node.js中的Express和Koa2&#xff0c;Go中的Beego和Gin等。今天要介绍的主角是ABP框架&…

【ArcGIS微课1000例】0049:制图表达(4)---自由式制图表达

文章目录 一、转换为自由表达并编辑二、将效果转换为几何当编辑地图时,可能会遇到一个独特的或显著的特征,需要专门的符号的情况,可以使用覆盖的制图表达来实现,但是往往不够。可能需要简单地绘制一个图形以达到要求的外观,这时可以尝试使用自由式制图表达。 自由式制图表…

基于FPGA的异步FIFO设计

今天要介绍的异步FIFO&#xff0c;可以有不同的读写时钟&#xff0c;即不同的时钟域。由于异步FIFO没有外部地址端口&#xff0c;因此内部采用读写指针并顺序读写&#xff0c;即先写进FIFO的数据先读取&#xff08;简称先进先出&#xff09;。这里的读写指针是异步的&#xff0…

顾小清:教育信息化进入数字化转型重要时期

身处技术加快更新、新概念频出的时代&#xff0c;教育信息化的发展更需要坚守以人为本的初心&#xff0c;在热点炒作的杂音中保持理智&#xff0c;避免盲目&#xff0c;抓住符合教育规律、满足教育需求、安全有效的准绳&#xff0c;理性推进和落实。 技术在不断发展&#xff0c…

EJB

Enterprise JavaBean,企业级javabean,是J2EE的一部分&#xff0c;定义了一个用于 开发基于组件的企业多重应用程序的标准。其特点包括网络服务支持和核心开发工具(SDK)。 是Java的核心代码&#xff0c;分别是会话Bean&#xff08;Session Bean&#xff09;&#xff0c;实体Be…

java 连接redis 以及基本操作

一、首先下载安装redis 二、项目搭建 1.搭建一个maven 工程 2. 在pom.xml文件的dependencies节点下增加如下内容&#xff1a; <!-- resis --><dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version&…

WinForm(一):开始一个WinForm程序

WinForm程序只能运行在Windows上&#xff0c;即使是基于.NET5&#xff0c;6&#xff0c;7也一样。因为WinForm的UI层对接的底层API是基于Windows的。用VisualStudio创建一个WinForm应用很简单&#xff0c;建议使用非.NET Framework版&#xff0c;因为.NET Framework微软渐渐不支…

【ArcGIS微课1000例】0050:Geodatabase属性域操作全解

文章目录 1. 属性域的创建2. 属性域的查看3. 属性域的删除与修改4. 属性域的关联地理数据库按照面向对象的模型存储地理信息,也可以将其非空间信息保存在表中。对于要素和表可以设置一些规则进行限制,对属性的约束称为属性域。 属性域是描述字段合法值的规则,是一种增强数据…

ctype.h

isalpha&#xff1a;int isalpha(char ch);检查ch是否是字母.是字母返回非0&#xff0c;否则返回0。iscntrl&#xff1a; int iscntrl(int ch); 检查ch是否控制字符(其ASCII码在0和0x1F之间,数值为 0-31).是返回非0,否则返回 0.isdigit&#xff1a;int isdigit(char ch);检查ch…

『JavaScript』核心

为什么80%的码农都做不了架构师&#xff1f;>>> 弱类型语言 JavaScript是一种弱类型的语言。变量可以根据所赋的值改变类型。原始类型之间也可以进行类型转换。其弱类型的物质为其带来了极大的灵活性。 注意&#xff1a;原始类型使用值传递&#xff0c;复合类型使用…

优酷VIP会员周卡只需7.5元,看《沉香如屑》用优酷视频

由杨紫、成毅主演的《沉香如屑》已上线7天。站内热度值已经破万&#xff0c;也拿下了4次日冠的好成绩。追优酷视频最新热剧不能没有优酷VIP会员啊&#xff0c;优酷的会员&#xff0c;价格算是最便宜的了&#xff0c;下面是幻海优品优酷VIP会员特价充值的价格。优酷VIP会员特价充…

Solr6.1.0Windows安装步骤

一、 环境 solr 6.1.0 下载地址 http://archive.apache.org/dist/lucene/solr/6.1.0/ jdk 1.8 tomcat8 二、 安装solr到tomcat 1.解压solr&#xff0c;把 solr-6.1.0\solr-6.1.0\server 下的solr-webapp 文件夹拷贝到tomcat 的webapps下&#xff0c;重命名为solr&#xff1b;…

[转]Autofac 框架初识与应用

一、前言 这上一篇中&#xff0c;主要讲述了什么是IoC容器&#xff0c;以及了解到它是DI构造函注入的框架&#xff0c;它管理着依赖项的生命周期以及映射关系&#xff0c;同时也介绍实践了在ASP.Net Core中,默认提供的内置IoC容器&#xff0c;以及它的实例注册方式和相应的生命…

【ArcGIS微课1000例】0051:Geodatabase子类型操作全解

子类型是要素类中具有相同属性的要素的子集&#xff0c;或表中具有相同属性的对象的子集。可 通过它们对数据进行分类。 子类型是特征类(或对象类)中特征(或对象)的次级分类。例如一个公路线要素类可以根 据其字段类型的值细分为“高速公路”和“普通公路”两个子类型。 子类…

作为Java程序员应该掌握的10项技能

本文详细罗列了作为Java程序员应该掌握的10项技能。分享给大家供大家参考。具体如下&#xff1a; 1、语法&#xff1a;必须比较熟悉&#xff0c;在写代码的时候IDE的编辑器对某一行报错应该能够根据报错信息知道是什么样的语法错误并且知道任何修正。 2、命令&#xff1a;必须熟…

在Winform程序中设置管理员权限及为用户组添加写入权限

在我们一些Winform程序中&#xff0c;往往需要具有一些特殊的权限才能操作系统文件&#xff0c;我们可以设置运行程序具有管理员权限或者设置运行程序的目录具有写入的权限&#xff0c;如果是在操作系统里面&#xff0c;我们可以设置运行程序以管理员身份运行&#xff0c;或者设…

数据库性能系列之索引(上)

前言上一次&#xff0c;我们从优化子查询的角度&#xff0c;讲解了一些简单的数据库性能优化方面的知识。通过优化子查询的顺序&#xff0c;包括合理使用IN和EXISTS&#xff0c;可以起到部分查询的效率提升。但对于其他大多数场景&#xff0c;如单表记录很大&#xff0c;或多表…

题目1023:EXCEL排序---------Case后面的是count,不是C

#include<stdio.h> #include<algorithm> #include<cstring> using namespace std;struct student {char num[10];char name[10];int grade; }s[100002]; int cmp1(student s1,student s2)//case 1 按照学号递增 {return strcmp(s1.num,s2.num)<0; } int…

【ArcGIS微课1000例】0052:创建地理数据库注记(标准注记、要素关联注记、尺寸注记)

本文讲述创建地理数据库注记(标准注记、要素关联注记、尺寸注记)的方法。 文章目录 一、创建标准注记二、创建与要素关联的注记三、创建尺寸注记一、创建标准注记 标准注记不与地理数据库中的要素关联。标准注记的一个例子是,地图上标记某山脉的文字,没有特定的要索代表该…