JS在线运行

版本:

所属目录
点击了解高性能代码运行API
运行结果
教程手册
代码仓库
极速运行
终端运行
图形+终端

                        
以下是用户最新保存的代码
<h1> sort的使用 发布于:2025-07-01 14:35 <h1> slice的使用 发布于:2025-07-01 14:31 <h1> shift的使用 发布于:2025-07-01 14:27 <h1> push的使用 发布于:2025-07-01 14:21 <h1> join的补充与pop的使用 发布于:2025-07-01 14:17 <h1> split与join的使用 发布于:2025-07-01 14:09 <h1> concat的使用 发布于:2025-07-01 11:52 <h1> indexOf的使用 发布于:2025-07-01 11:48 <h1> forEach的使用 发布于:2025-07-01 11:42 <h1> filter的使用 发布于:2025-07-01 11:25 <h1> some使用 发布于:2025-07-01 11:20 <h1> every使用 发布于:2025-07-01 11:16 <h1> reduce使用 发布于:2025-07-01 11:08 <h1> 数组 发布于:2025-07-01 11:05 <h1> 箭头函数 发布于:2025-07-01 10:53 <h1>数组方法 发布于:2025-07-01 11:52 <h1>箭头函数与...rest的结合 发布于:2025-07-01 10:24 <h1>箭头函数知识点 发布于:2025-07-01 10:19 js base64 发布于:2025-06-28 01:16 栅格化所有形状图层 发布于:2025-06-01 16:20 雪花算法ID 发布于:2025-05-30 13:59 Create a new reservation balalal 发布于:2025-06-28 18:44 Main message loop 发布于:2025-05-28 09:33 .env 发布于:2025-05-27 22:57 logger.js 发布于:2025-05-27 22:56 api.js 发布于:2025-05-27 22:56 SchedulerService.js 发布于:2025-05-27 22:55 WebhookService.js 发布于:2025-05-27 22:55 WeChatService.js 发布于:2025-05-27 22:54 database.js 发布于:2025-05-27 22:54 server.js 发布于:2025-05-27 22:53 package.json 发布于:2025-05-27 22:52 suzhou inovance shanglvlianmeng 发布于:2025-06-04 19:05 CryptoJS-node 发布于:2025-05-23 13:51 Promise链式调用示例 发布于:2025-05-21 19:40 扁平化JSON数据 发布于:2025-05-13 16:18 // 1. 粘贴你的原始 JSON 字符串 let raw = `{ "10": { "upgrade": 0 }, "15": { "upgrade": 3 }, "20": { "upgrade": 4 } }`; // 2. 解析为对象 let data = JSON.parse(raw); // 3. 批量处理 upgrade 字段 for (let k in data) { if (data[k].upgrade !== undefined) { data[k].upgrade = Math.floor(data[k].upgrade / 2); // 向下取整 } } // 4. 输出新 JSON 字符串 console.log(JSON.stringify(data, null, 2)); 发布于:2025-05-13 10:39 AES加解密 发布于:2025-05-08 13:31 ceshi damai 发布于:2025-05-06 22:53 新编写的企划内容 发布于:2025-04-30 20:25 JavaScript脚本与MongoDB服务器交互 发布于:2025-04-30 14:09 临时使用代码 发布于:2025-04-29 20:00 - 统计数组里最多的元素,并排序 - 构建树形结构并进行后续遍历 发布于:2025-06-05 15:27 手写防抖和节流 发布于:2025-05-16 16:58 check in balalal 发布于:2025-05-25 11:42 最近一次给学姐的代码 发布于:2025-04-26 13:13 JS AES128加解密 发布于:2025-04-21 13:44 最小矩阵宽度(从第一列开始一列列加,直到判断子矩阵内包含数组的所有元素) 发布于:2025-04-16 19:10 最小交付时间(二分+回溯:先将数组排序,最小值start=Math.max(arr),最大值end = arr.reduce,回溯中创建一个新的工人数组,每次遍历数组时将数组中的每一个元素都尝试分配给worker[i]) 发布于:2025-04-16 18:53 阿里巴巴找黄金宝箱Ⅳ(单调栈:栈中存储单调递减的元素的集合,当找到比栈顶元素大的元素时,循环出栈直到栈顶元素不小于当前元素) 发布于:2025-04-15 17:47 [更多]
显示目录

事件



学习嵌入式的绝佳套件,esp8266开源小电视成品,比自己去买开发板+屏幕还要便宜,省去了焊接不当搞坏的风险。 蜂鸣版+触控升级仅36元,更强的硬件、价格全网最低。

点击购买 固件广场

Node.js 事件

Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列。

Node.js 里面的许多对象都会分发事件:一个net.Server对象会在每次有新连接时分发一个事件, 一个fs.readStream对象会在文件被打开的时候发出一个事件。 所有这些产生事件的对象都是 events.EventEmitter 的实例。 你可以通过require("events");来访问该模块。

下面我们用一个简单的例子说明 EventEmitter 的用法:

//event.js 
var EventEmitter = require('events').EventEmitter; 
var event = new EventEmitter(); 
event.on('some_event', function() { 
    console.log('some_event occured.'); 
}); 
setTimeout(function() { 
    event.emit('some_event'); 
}, 1000);

运行这段代码,1秒后控制台输出了 'some_event occured'。其原理是 event 对象注册了事件 some_event 的一个监听器,然后我们通过 setTimeout 在1000毫秒以后向 event 对象发送事件 some_event,此时会调用 some_event 的监听器。


EventEmitter介绍

events 模块只提供了一个对象: events.EventEmitter。EventEmitter 的核心就 是事件发射与事件监听器功能的封装。

EventEmitter 的每个事件由一个事件名和若干个参 数组成,事件名是一个字符串,通常表达一定的语义。对于每个事件,EventEmitter 支持 若干个事件监听器。

当事件发射时,注册到这个事件的事件监听器被依次调用,事件参数作 为回调函数参数传递。

让我们以下面的例子解释这个过程:

var events = require('events'); 
var emitter = new events.EventEmitter(); 
emitter.on('someEvent', function(arg1, arg2) { 
    console.log('listener1', arg1, arg2); 
}); 
emitter.on('someEvent', function(arg1, arg2) { 
 console.log('listener2', arg1, arg2); 
}); 
emitter.emit('someEvent', 'byvoid', 1991);

运行的结果是:

listener1 byvoid 1991 
listener2 byvoid 1991

以上例子中,emitter 为事件 someEvent 注册了两个事件监听器,然后发射了 someEvent 事件。运行结果中可以看到两个事件监听器回调函数被先后调用。 这就是EventEmitter最简单的用法。

EventEmitter常用的API

EventEmitter.on(event, listener)、emitter.addListener(event, listener) 为指定事件注册一个监听器,接收一个字符串 event 和一个回调函数 listener。

server.on('connection', function (stream) {
  console.log('someone connected!');
});

EventEmitter.emit(event, [arg1], [arg2], [...]) 发射 event 事件,传 递若干可选参数到事件监听器的参数表。

EventEmitter.once(event, listener) 为指定事件注册一个单次监听器,即 监听器最多只会触发一次,触发后立刻解除该监听器。

server.once('connection', function (stream) {
  console.log('Ah, we have our first user!');
});

EventEmitter.removeListener(event, listener) 移除指定事件的某个监听 器,listener 必须是该事件已经注册过的监听器。

var callback = function(stream) {
  console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);

EventEmitter.removeAllListeners([event]) 移除所有事件的所有监听器, 如果指定 event,则移除指定事件的所有监听器。


error 事件

EventEmitter 定义了一个特殊的事件 error,它包含了"错误"的语义,我们在遇到 异常的时候通常会发射 error 事件。

当 error 被发射时,EventEmitter 规定如果没有响 应的监听器,Node.js 会把它当作异常,退出程序并打印调用栈。

我们一般要为会发射 error 事件的对象设置监听器,避免遇到错误后整个程序崩溃。例如:

var events = require('events'); 
var emitter = new events.EventEmitter(); 
emitter.emit('error');

运行时会显示以下错误:

node.js:201 
throw e; // process.nextTick error, or 'error' event on first tick 
^ 
Error: Uncaught, unspecified 'error' event. 
at EventEmitter.emit (events.js:50:15) 
at Object. (/home/byvoid/error.js:5:9) 
at Module._compile (module.js:441:26) 
at Object..js (module.js:459:10) 
at Module.load (module.js:348:31) 
at Function._load (module.js:308:12) 
at Array.0 (module.js:479:10) 
at EventEmitter._tickCallback (node.js:192:40)

继承 EventEmitter

大多数时候我们不会直接使用 EventEmitter,而是在对象中继承它。包括 fs、net、 http 在内的,只要是支持事件响应的核心模块都是 EventEmitter 的子类。

为什么要这样做呢?原因有两点:

首先,具有某个实体功能的对象实现事件符合语义, 事件的监听和发射应该是一个对象的方法。

其次JavaScript 的对象机制是基于原型的,支持 部分多重继承,继承 EventEmitter 不会打乱对象原有的继承关系。

由JSRUN为你提供的JS在线运行、在线编译工具
        JSRUN提供的JS 在线运行,JS 在线运行工具,基于linux操作系统环境提供线上编译和线上运行,具有运行快速,运行结果与常用开发、生产环境保持一致的特点。
yout