轉向Javascript後,開始學習了node.js,選擇的第一本書是《Node.js in Action》html
將近一個月時間,斷斷續續看完,選幾個點作下筆記node
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.實現並行化流程控制dom
//並行讀取文件並統計單詞 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](); } });