《Node.js In Action》笔记之流程控制
转向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](); } });