• 《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('
    ');
            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]();
        }
    });
  • 相关阅读:
    如何解决C#异常:必须先将当前线程设置为单线程单元(STA)模式,然后才能进行OLE调用,请确保你的Main函数已在其上标记了STAThreadAttribute
    go多态
    go泛型
    protoc工具使用
    grpc protobuf协议
    grpc根据proto文件自动生成go源码
    go安装grpc
    go protobuf
    go读取http.Request中body的内容
    go数据库操作
  • 原文地址:https://www.cnblogs.com/GongQi/p/5043229.html
Copyright © 2020-2023  润新知