Node js 安装+回调函数+事件
/*
从网站 https://nodejs.org/zh-cn/ 下载 这里用的 9.4.0 版本
下载完安装
安装目录是 D:\ApacheServer\node
一路默认安装
安装后打开cmd命令行输入
path
在显示的结果中查找是否有 D:\ApacheServer\node\
有的话表示环境变量中已经包含了 D:\ApacheServer\node\ 可以在cmd中直接使用 node 这个命令
如在当前命令行中输入
node --version
显示
v9.4.0
当前nodejs的版本 =========================输出 Hello World
编写代码前先了解node运行情况
如果使用PHP来编写后端的代码时,需要Apache 或者 Nginx 的HTTP 服务器,并配上 mod_php5 模块和php-cgi。
从这个角度看,整个"接收 HTTP 请求并提供 Web 页面"的需求根本不需 要 PHP 来处理。
不过对 Node.js 来说,概念完全不一样了。使用 Node.js 时,不仅仅 在实现一个应用,同时还实现了整个 HTTP 服务器(请求的获取返回,监听的端口)。 先了解下 Node.js 应用是由哪几部分组成的
一 引入 required 模块 : 可以使用 require 指令来载入 Node.js 模块。
二 创建服务器 : 服务器可以监听客户端的请求,类似于 Apache 、Nginx 等 HTTP 服务器。
三 接收请求与响应请求 : 服务器很容易创建,客户端可以使用浏览器或终端发送 HTTP 请求,服务器接收请求后返回响应数据。
*/ //===============================以下代码为test.js文件中内容========================================== //步骤一、引入 required 模块,使用 require 指令来载入 http 模块,并将实例化的 HTTP 赋值给变量 http
var http = require('http'); // 步骤二、创建服务器
// 使用 http.createServer() 方法创建服务器,并使用 listen 方法绑定 8888 端口。 函数通过 request,response 参数来接收和响应数据。
http.createServer(function(request, response) { // 发送 HTTP 头部
// HTTP 状态值: 200 : OK
// 内容类型: text/plain
response.writeHead(200, {
'Content-Type' : 'text/plain'
}); // 发送响应数据 "Hello World"
response.end('Hello World 哈哈哈哈\n'); }).listen(8888); // 执行该js文件后终端(这里是cmd命令行)打印的信息
console.log('Server running at http://127.0.0.1:8888/'); //===============================以上代码为test.js文件中内容========================================== /*
编码文件保存在 D:\ApacheServer\web\test\test.js
在cmd中切换到编码目录下
d:
cd ApacheServer/web/test 执行test.js文件
node test.js
此时可以在浏览器中打开页面,期间不能关闭cmd命令行,否则执行文件终止,浏览器不能访问
http://127.0.0.1:8888/
*/ /*
=========================Node.js 回调函数
Node.js 异步编程的直接体现就是回调。
异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了。
回调函数在完成任务后就会被调用
Node 使用了大量的回调函数,Node 所有 API 都支持回调函数。
例如,可以一边读取文件,一边执行其他命令,在文件读取完成后,将文件内容作为回调函数的参数返回。这样在执行代码时就没有阻塞或等待文件 I/O 操作。这就大大提高了 Node.js 的性能,可以处理大量的并发请求。
以下代码示例同步及异步+回调方法的不同
*/ //创建一个文件 input.txt ,内容:这是一段测试内容 //===============================以下代码为main.js文件中内容==========================================
//首先是阻塞代码实例(同步顺序执行)
var fs = require("fs"); var data = fs.readFileSync('input.txt'); console.log(data.toString());
console.log("程序执行结束!");
//===============================以上代码为main.js文件中内容==========================================
/*
执行main.js
node main.js
输出内容:
这是一段测试内容
程序执行结束!
*/ //===============================以下代码为main.js文件中内容==========================================
//非阻塞代码实例(异步+回调执行)
var fs = require("fs"); //readFile方法的第二个参数就是回调函数,先读取input.txt文件,读取完后调用后面的方法并传参
fs.readFile('input.txt', function (err, data) {
if (err){
return console.error(err);
}
console.log(data.toString());
}); console.log("程序执行结束!");
//===============================以上代码为main.js文件中内容==========================================
/*
执行main.js
node main.js
输出内容:
程序执行结束!
这是一段测试内容 以上两个实例显示阻塞与非阻塞调用的不同。第一个实例在文件读取完后才执行下面代码。 第二个实例不需要等待文件读取完,这样就可以在读取文件时同时执行接下来的代码,大大提高了程序的性能。
因此,阻塞是按顺序执行的,而非阻塞是不需要按顺序的,所以如果需要处理回调函数的参数,就需要写在回调函数内。
*/ //=========================Node.js 事件及事件循环
/*
Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。
Node.js 的每一个 API(预定义函数) 都是异步的,并作为一个独立线程运行,使用异步函数调用,处理并发。
Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。
Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者后退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数. 事件驱动程序
Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。
当这个请求完成,它被放回处理队列,当该请求排序到队列开头,这个结果被返回给用户。
这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)
在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。 Node.js 有多个内置的事件,可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,并且events 模块只提供了一个类对象: events.EventEmitter。EventEmitter 的核心就是事件触发与事件监听器功能的封装。
步骤如下:
// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();
// 绑定事件及事件的监听处理程序,eventName为自定义事件名,eventHandler1及eventHandler2变量各代表一个自定义函数,这里表示eventName事件的一个监听程序,同一个事件可以绑定多个监听程序,当触发事件时,绑定的所有监听程序将依次执行
下面实例有具体应用
eventEmitter.on('eventName', eventHandler1);
eventEmitter.on('eventName', eventHandler2);
// 触发事件
eventEmitter.emit('eventName');
//这时eventName事件绑定的eventHandler1,eventHandler2两个监听函数都将执行 EventEmitter 的每个事件由一个事件名和若干个参数组成,事件名是一个字符串,通常表达一定的语义。对于每个事件,EventEmitter 支持 若干个事件监听器。
EventEmitter 对象如果在实例化时发生错误,会触发 error 事件。当添加新的监听器时,newListener 事件会触发,当监听器被移除时,removeListener 事件被触发。
Node.js里面的许多对象都会分发事件:一个net.Server对象会在每次有新连接时分发一个事件, 一个fs.readStream对象会在文件被打开的时候发出一个事件。 所有这些产生事件的对象都是 events.EventEmitter 的实例。
*/ //实例
//===============================以下代码为main.js文件中内容==========================================
//引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();
//以上两句也可改写成
/*
var EventEmitter = require('events').EventEmitter;
var eventEmitter = new EventEmitter();
*/ // 创建事件处理程序
var connectHandler = function connected() {
console.log('连接成功。'); // 触发 data_received 事件
eventEmitter.emit('data_received', 'arg1 参数', 'arg2 参数');
} // 绑定 connection 事件处理程序
eventEmitter.on('connection', connectHandler); // 使用匿名函数绑定 data_received 事件
eventEmitter.on('data_received', function(arg1, arg2) {
console.log('数据接收成功。'+arg1+arg2);
}); // 触发 connection 事件
eventEmitter.emit('connection'); console.log("程序执行完毕。"); //===============================以上代码为main.js文件中内容==========================================
/*
执行main.js
node main.js
输出内容:
连接成功。
数据接收成功。arg1 参数arg2 参数
程序执行完毕。
*/ //更多EventEmitter对象例子
//实例
//===============================以下代码为main.js文件中内容==========================================
var events = require('events');
var eventEmitter = new events.EventEmitter(); // 监听器 #1
var listener1 = function listener1() {
console.log('监听器 listener1 执行。');
} // 监听器 #2
var listener2 = function listener2() {
console.log('监听器 listener2 执行。');
} //监听器 #3
var listener3 = function listener3() {
console.log('监听器 listener3 执行。');
} // addListener(event, listener) 为指定事件添加一个监听器到监听器数组的尾部。
// 绑定 connection 事件,处理函数为 listener1
eventEmitter.addListener('connection', listener1); // on(event, listener) 为指定事件注册一个监听器,接受一个字符串 event 和一个回调函数。
// eventEmitter.on()与eventEmitter.addListener()没有区别,且一个事件可以绑定多个回调函数。
// 绑定 connection 事件,处理函数为 listener2
eventEmitter.on('connection', listener2); // once(event, listener) 为指定事件注册一个单次监听器,即 监听器最多只会触发一次,触发后立刻解除该监听器。
//绑定 connection 事件,处理函数为 listener3
eventEmitter.once('connection', listener3); //获取connection事件绑定了几个监听器
var eventListeners = require('events').EventEmitter.listenerCount(eventEmitter, 'connection');
console.log(eventListeners + " 个监听器监听连接事件。"); var eventListenerArr = eventEmitter.listeners('connection');
console.log(eventListenerArr); // 处理 connection 事件
eventEmitter.emit('connection'); // removeListener(event, listener) 移除指定事件的某个监听器,监听器必须是该事件已经注册过的监听器。它接受两个参数,第一个是事件名称,第二个是回调函数名称。
// removeAllListeners([event]) 移除所有事件的所有监听器, 如果指定事件,则移除指定事件的所有监听器(这里的中括号[]表示可有可无,不是数组)。
// 移除监绑定的 listener1 函数
eventEmitter.removeListener('connection', listener1);
console.log("listener1 不再受监听。"); // 触发连接事件
eventEmitter.emit('connection'); eventListeners = require('events').EventEmitter.listenerCount(eventEmitter, 'connection');
console.log(eventListeners + " 个监听器监听连接事件。"); console.log("程序执行完毕。"); // EventEmitter 定义了一个特殊的事件 error,它包含了错误的语义,我们在遇到 异常的时候通常会触发 error 事件。
// eventEmitter.emit('error'); //===============================以上代码为main.js文件中内容==========================================
/*
执行main.js
node main.js
输出内容:
3 个监听器监听连接事件。
[ [Function: listener1],
[Function: listener2],
[Function: listener3] ]
监听器 listener1 执行。
监听器 listener2 执行。
监听器 listener3 执行。
listener1 不再受监听。
监听器 listener2 执行。
1 个监听器监听连接事件。
程序执行完毕。
*/
Node js 安装+回调函数+事件的更多相关文章
- Node.js:回调函数
概要:本篇博客主要通过对比node.js异步与同步方式读取文件的方式来解释node中回调函数的作用. 1.异步方式读取文件: 新建一个文本文档用于测试,如下图: 代码如下: // node异步方式读取 ...
- 【node.js】回调函数
学习链接:http://www.runoob.com/nodejs/nodejs-callback.html Node.js 异步编程的直接体现就是回调. 异步编程依托于回调来实现,但不能说使用了回调 ...
- Node.js 阻塞 回调函数
回调例程 N所有API都支持回调函数,可以处理大量并发请求.回调函数一般作为最后一个参数出现: function foo1(name, age, callback){ } function foo2( ...
- node.js 中回调函数callback(转载),说的很清楚,看一遍就理解了
最近在看 express,满眼看去,到处是以函数作为参数的回调函数的使用.如果这个概念理解不了,nodejs.express 的代码就会看得一塌糊涂.比如: 复制代码 代码如下: app.use(fu ...
- node.js通过回调函数获取异步函数的返回结果
html文件代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- Node.js 教程 05 - EventEmitter(事件监听/发射器 )
目录: 前言 Node.js事件驱动介绍 Node.js事件 注册并发射自定义Node.js事件 EventEmitter介绍 EventEmitter常用的API error事件 继承EventEm ...
- Node.js实战(九)之事件循环
Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高. Node.js 几乎每一个 API 都是支持回调函数的. Node ...
- node.js 安装方法 以及 用原声搭建服务器
node.js 安装方法: 第一步: 64位的安装包网址: https://nodejs.org/dist/v4.4.3/node-v4.4.3-x64.msi 第二步: 进入命令提示框 输入 ...
- nodejs-REPL/回调函数/事件循环
REPL 回调函数 事件循环 REPL----------------------------------------------------- Node.js REPL(Read Eval Prin ...
随机推荐
- 蓝牙实现对等网络连接 <GameKit/GameKit.h>
/* 1.设置UI界面 2.引入框架 3.点击选择照片 4.连接蓝牙设备 5.实现蓝牙的代理方法 6.发送照片 */ #import "ViewController.h" #imp ...
- Vue--- Vue(Pubsub + Ajax) 数据交互
案例知识点 兄弟组件儿的通信 使用了Pubsub 订阅与发布 ajax数据请求 获取前 获取中 获取后 获取为空 获取异常 获取成功后显示数据给到 原先定义号的 ...
- js中判断数组中是否包含某元素的方法
方法一:array.indexOf(item,start):元素在数组中的位置,如果没与搜索到则返回 -1. 参数 描述 item 必须.查找的元素. start 可选的整数参数.规定在数组中开始检索 ...
- 【PTA 天梯赛】L2-026. 小字辈(广搜+邻接表)
本题给定一个庞大家族的家谱,要请你给出最小一辈的名单. 输入格式: 输入在第一行给出家族人口总数 N(不超过 100 000 的正整数) —— 简单起见,我们把家族成员从 1 到 N 编号.随后第二行 ...
- VMware ESXi-6.7——安装
前提条件: 下载ESXi-ISO镜像文件 制作启动文件 将服务器调试为U盘启动 进入U盘启动模式 1. 进入ESXi的安装页面 选择要安装的磁盘 选择USB口驱动 设置一个root密码 保存数据提示 ...
- Jenkins 添加节点 java web方式
环境说明: 主节点:windows server 从节点:两台linux 1. windows server安装jenkins就不多说了,直接添加节点配置如下 2.全局安全配置,指定确认的端口后,记得 ...
- PHP学习课程和培训方向学习路线分享
php语言的优越性,集结了很多的开发爱好者,无论行业前景和个人发展来说,php正飞速的发展,php在不断兼容着类似closures和命名空间 等技术,同时兼顾性能和当下流行的框架.版本是7之后,一直在 ...
- 图解HTTP总结(8)——确认访问用户身份的认证
Session 管理及 Cookie 应用 基于表单认证的标准规范尚未有定论,一般会使用Cookie来管理Session(会话). 基于表单认证本身是通过服务器端的Web应用,将客户端发送过来的用户I ...
- Fragment保持状态切换
在使用Activity管理多个Fragment时,每次切换Fragment使用的是replace,结果导致出现xxx is not currently in the FragmentManager异常 ...
- netty学习记录2
昨天晚上在看到7.2章MessagePack编码器和解码器开发这一章时,书里面没有贴出全部的代码,然后我按照我自己的想法把代码补全后,发现死活没有把代码跑通. 然后花了挺多时间在网上找,很多博客都贴出 ...