转向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. LeetCode: LRU Cache [146]

    [题目] Design and implement a data structure for Least Recently Used (LRU) cache. It should support th ...

  2. poj1860 解题报告

    题意:这里有N种货币,分别记为1~N,有M种货币交换的方式,每一种方式有A,B两种钱币,有RAB, CAB, RBA and CBA,四个数,表示交换率, Nick手上有其中的一种货币S,货币S的钱数 ...

  3. Vertica数据库操作

    删除主键(Vertica数据库的主键值并非唯一的): SELECT ANALYZE_CONSTRAINTS('fb_s.c_log'); 找到key名,再: ALTER TABLE fb_s.c_lo ...

  4. 使用高德地图API

    http://lbs.amap.com/smart/map/developer/mode/ 简单的附上一张图,其实能做得比这个更强大.

  5. 模拟产生CBC LATCH与buffer busy wait等待事件

    数据库版本:11.2.0.4.0 1.查出表TEST相关信息 select rowid, dbms_rowid.rowid_row_number(rowid) rowid_rownum, dbms_r ...

  6. ASP.NET - 在线编辑器(KindEditor)

    效果: 项目结构: 前端代码: <%@ Page Language="C#" AutoEventWireup="true" CodeFile=" ...

  7. centos6安装bt工具transmission

    centos6 install transmission 1.  安装所需的组件: yum -y install gcc gcc-c++ m4 make automake libtool gettex ...

  8. android中,如果使用imageButton可以在drawable 中设置一个selector,但是imageView设置不起作用

    android中,如果使用imageButton可以在drawable 中设置一个selector,但是imageView设置不起作用,只要把Imageview的src给去掉就成了,src捕获了bac ...

  9. hao947 : Mybatis resultMap配置插入和主键自增返回 : 好947

    映射配置文件  好947  <!-- type:映射实体类的数据类型 id:resultMap的唯一标识 -->  <resultMap type="person" ...

  10. [Java学习笔记]Java Tips

    1.Java没有sizeof关键字 , volatile是java关键字.详情见:http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166. ...