Node的事件驱动艺术bug实例(bugs in server-side event driven architecture (EDA))
2018-01-30 17:47
525 查看
最近在学node,突然发现Stream的文件尾部添加操作可能出现覆盖bug。
下面是会出现bug的代码:
let fs = require('fs');
let data = '';
let data2 = '你的小青蛙是真的可爱';
//1.读取流
//创建可读流
let readStream = fs.createReadStream("input.txt");
//设置utf-8编码
readStream.setEncoding('UTF8');
//处理流事件
readStream.on('data', chunk => data += chunk);
readStream.on('end', () => writeS(data));
readStream.on("error", err => console.log(err.strck));
console.log("程序1执行完毕");
//2.写入流
//创建可写流
let writeS = dataS =>{
let writeStream = fs.createWriteStream("outInput.txt");
//使用utf-8写入流
writeStream.write(data2+dataS, "UTF8");
//标记文件末尾
writeStream.end();
//处理事件流
writeStream.on("finish", () => console.log("写入完成"));
writeStream.on("error", err => console.log(err.stack));
console.log("程序2执行完毕");
}
一下代码不会出现错误:
var fs = require('fs');
var read = fs.createReadStream('../data/input.txt');
//设置第二个参数append
var write = fs.createWriteStream('../data/out.txt', { 'flags': 'a' });
//管道流读写操作
read.pipe(write);
console.log('执行完毕');
为什么呢?
因为第一个用到了事件绑定来处理文件尾部添加,但是node的事件驱动本身有个bug就是node的事件驱动不会根据你绑定的时间顺序执行。
具体原理我在google查到了(可能要翻墙吆):
点击打开链接
点击打开链接
下面是会出现bug的代码:
let fs = require('fs');
let data = '';
let data2 = '你的小青蛙是真的可爱';
//1.读取流
//创建可读流
let readStream = fs.createReadStream("input.txt");
//设置utf-8编码
readStream.setEncoding('UTF8');
//处理流事件
readStream.on('data', chunk => data += chunk);
readStream.on('end', () => writeS(data));
readStream.on("error", err => console.log(err.strck));
console.log("程序1执行完毕");
//2.写入流
//创建可写流
let writeS = dataS =>{
let writeStream = fs.createWriteStream("outInput.txt");
//使用utf-8写入流
writeStream.write(data2+dataS, "UTF8");
//标记文件末尾
writeStream.end();
//处理事件流
writeStream.on("finish", () => console.log("写入完成"));
writeStream.on("error", err => console.log(err.stack));
console.log("程序2执行完毕");
}
一下代码不会出现错误:
var fs = require('fs');
var read = fs.createReadStream('../data/input.txt');
//设置第二个参数append
var write = fs.createWriteStream('../data/out.txt', { 'flags': 'a' });
//管道流读写操作
read.pipe(write);
console.log('执行完毕');
为什么呢?
因为第一个用到了事件绑定来处理文件尾部添加,但是node的事件驱动本身有个bug就是node的事件驱动不会根据你绑定的时间顺序执行。
具体原理我在google查到了(可能要翻墙吆):
点击打开链接
点击打开链接
相关文章推荐
- 接口连接架构(Interface Connection Architecture)和事件驱动架构(Event Driven Architecture)
- node.js事件驱动--Why are event-driven servers so great?
- bug:ERROR org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode: Exception in doCheckpoint
- JScript|Event]面向事件驱动的编程(二)--实例讲解:将span模拟成超连接
- AUTOIT3的OnEvent(事件驱动)模式一处BUG?
- SOA EDA 事件驱动架构 (Event-Driven Architecture,EDA) 简介
- What is Event Driven Architecture (EDA) and Why Does it Matter EDA 摘要
- Java学习笔记(15)Event-Driven Programming and Animations 事件驱动编程与动画
- Event-Driven XML Programming Guide--事件驱动解析XML
- 关于对事件驱动架构(event drive architecture)和事件驱动编程的理解。
- JScript|Event]面向事件驱动的编程(二)--实例讲解:将span模拟成超连接
- 从头开始讲Node.js——异步与事件驱动
- Node的结构和Chrome十分相似,基于事件驱动的异步架构
- bug:datanode启动后立刻死掉:java.io.IOException: Incompatible clusterIDs in....
- HTML5 服务器推送事件(Server-sent Events)简单实例
- Model Driven Architecture 模型驱动架构
- Event-driven services in SOA
- Node.js 事件驱动获取数据
- XAML实例教程系列 - 事件(Event)
- node.js的事件驱动