转向Javascript后,开始学习了node.js,选择的第一本书是《Node.js in Action》

将近一个月时间,断断续续看完,选几个点做下笔记

1.实现串行化流程控制

var fs=require('fs');
var request = request('request');
var htmlparser=require('htmlparser');
var configFilename='./rss_feeds.txt'; //task1,确保包含rss预定源URL列表的文件存在
function checkForRssFile(){
fs.exists(configFilename,function(exists){
if(!exists)
return next(new Error('Missing Rss file:'+configFilename));
next(null,configFilename);
})
} //task2,读取并解析包含预定源url的文件
function readRssFile(configFilename){
fs.readFile(configFilename, function (err,feedList) {
if(err) return next(err);
feedList = feedList
.toString()
.replace(/^\s+|\s+$/g,'')
.split('\n');
var random= Math.floor((Math.random()*feedList.length));
next(null,feedList[random]);
})
} //task3,向选定的预定源发送http请求以获取数据
function downloadRssFeed(feedUrl){
request({url:feedUrl},function(err,res,body){
if(err) return next(err);
if(res.statusCode !=200)
return next(new Error('Abnormal response status code'))
next(null,body);
});
} //task4 将预定源数据解析到一个条目数据中
function parseRssFeed(res){
var handler=new htmlparser.RssHandler();
var parser = new htmlparser.Parser(handler);
parser.parseComplete(rss);
if(!handler.dom.items.length)
return next(new Error('No rss items found'));
var item = handler.dom.items.shift();
console.log(item.title);
console.log(item.link);
} //把所有任务按执行顺序添加到一个数组中
var tasks=[checkForRssFile,readRssFile,downloadRssFeed,parseRssFeed]; function next(err,result){
if(err) throw err;
var currentTask=tasks.shift();
if(currentTask){
currentTask(result);
}
}
//开始任务的串行化执行
next();

2.实现并行化流程控制

//并行读取文件并统计单词
var fs=require('fs');
var completedTasks=0;
var tasks=[];
var wordCounts={};
var filesDir = './text'; function checkIfComplete(){
completedTasks ++;
if(completedTasks == tasks.length){
for(var index in wordCounts){
console.log(index + ":" +wordCounts[index]);
}
}
} function countWordsInText(text){
var words=text.toString().toLowerCase().split(/\W+/).sort();
for(var index in words){
if(word){
wordCounts[word]=(wordCounts[word])?wordCounts[word]+1:1;
}
}
} fs.readdir(filesDir,function(err,files){
if(err) throw err;
for(var index in files){
var task = (function(file){
return function(){
fs.readFile(file,function(err,text){
if(err) throw err;
countWordsInText(text);
checkIfComplete();
})
}
})(filesDir+'/'+files[index]);
tasks.push(task);
}
for(var task in tasks){
tasks[task]();
}
});

《Node.js In Action》笔记之流程控制的更多相关文章

  1. Node.js中Async详解:流程控制

    安装 npm install async --save 地址 https://github.com/caolan/async Async的内容主要分为三部分 流程控制: 简化九种常见的流程的处理 集合 ...

  2. node.js入门学习笔记整理

    (1)node Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node与javaScript的区别在于,javaScript的顶层对象是window,而no ...

  3. Node.js入门学习笔记(三)

    基于事件驱动的回调 这个问题不好回答,不过这是Node.js原生的工作方式.它是事件驱动的,这也是它为什么这么快的原因.你可以花一点时间阅读一下Felix Geisendörfer的大作 Unders ...

  4. node.js基本工作原理及流程

    概述 Node.js是什么 Node 是一个服务器端 JavaScript 解释器,用于方便地搭建响应速度快.易于扩展的网络应用.Node.js 使用事件驱动, 非阻塞I/O 模型而得以轻量和高效,非 ...

  5. node.js 初学 自我笔记整理 day01

     node.js   概念问题: Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境.   npm是一个node的包管理工具  ,也是一个网站  ,还是一条命令.N ...

  6. Node.js API学习笔记(一)

    此文章已经发表于本人博客. Terminal(终端) 说起这个使用过linux系统的兄台一般都会知道的,本人理解:类似Putty这些ssh工具通过 软件来实现远程控制主机,对于我们使用者来说,它会显示 ...

  7. 《深入浅出Node.js》学习笔记(一)

    看了朴灵前辈的node.js系列文章,很开阔视野,虽然能力有限还是有很多不懂,但是还是希望能写下笔记,初步对node.js有点了解. 一.概念 Node.js不是JS应用.而是JS运行平台 Node. ...

  8. Node.JS学习——学习笔记

    Node.JS--学习笔记 2020年02月23日11:52:01 我打算自学NodeJS-通过阅读NodeJS官网来完成. https://nodejs.org/dist/latest-v13.x/ ...

  9. Node.js入门学习笔记(一)

    先来个最常见的"Hello World!". 打开你最喜欢的编辑器(我用的是Sublime Text),创建一个helloWorld.js的文件.我们要做的就是向stdout输出& ...

随机推荐

  1. webdynpro的select_option示例

    需求,输入航线代码和航线编号区间,查询记录存在表中显示,并不是alv显示 1.使用组件WDR_SELECT_OPTIONS. 2.在组件控制器中加入以下组件 3.在视图属性中也添加该组件 4.创建节点 ...

  2. Selenium Webdriver firefox 浏览器问题

    Selenium Webdriver 在使用firefox 测试会牵扯到firefox的安装路径的问题 1.默认安装路径在c盘的情况下: WebDriver driver = new FirefoxD ...

  3. iOS两个强制旋转屏幕的方法

    第一个: // 状态栏动画持续时间 CGFloat duration = [UIApplication sharedApplication].statusBarOrientationAnimation ...

  4. Codeforces Round #218 (Div. 2)

    500pt, 题目链接:http://codeforces.com/problemset/problem/371/A 分析:k-periodic说明每一段长度为k,整个数组被分成这样长度为k的片段,要 ...

  5. 自适应滤波器(Adaptive Filter)

    ======= Wikipedia的解释 ======= 自适应滤波器是能够根据输入信号自动调整性能进行数字信号处理的数字滤波器.作为对比,非自适应滤波器有静态的滤波器系数,这些静态系数一起组成传递函 ...

  6. Velocity教程-脚本语法详解(转)

    Velocity是一个基于java的模板引擎(template engine).它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象. 当Veloci ...

  7. Effective C++ 24,25

    24.在函数重载和设定參数缺省值间要谨慎选择. 获得一种类型的数据的最小值或最大值,对于c中,一般使用在<linits.h>中定义的各种宏如INT_MIN 来进行表示,可是这样无法进行泛型 ...

  8. sqlserver 操作技巧

    1.将不同库中的一张表数据导入到另外一张表中去 ① 两张表多存在实体,两表的字段相同,字段的顺序相同的话. insert into 表B select * from 表A ② 两张表多存在实体,两表的 ...

  9. hdu 4039 The Social Network

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4039 题目分类:字符串+bfs 题意:给一个人际关系图,根据关系图,给一个人推荐一个人认识 题目分析: ...

  10. 魔棒工具--RegionGrow算法简介

    原地址:http://www.cnblogs.com/easymind223/archive/2012/07/04/2576964.html ps里面的魔棒工具非常好用,是图像处理中非常常用的一个工具 ...