美文网首页我爱编程
《Node.js In Action》笔记之流程控制

《Node.js In Action》笔记之流程控制

作者: ronniegong | 来源:发表于2016-10-26 12:28 被阅读0次

    转向Javascript后,开始学习了node.js,选择的第一本书是《Node.js in Action》
    将近一个月时间,断断续续看完,选几个点做下笔记

    实现串行化流程控制

    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();
    

    实现并行化流程控制

    //并行读取文件并统计单词
    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》笔记之流程控制

        本文链接:https://www.haomeiwen.com/subject/zlvduttx.html