转向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]();
}
});