node——含有异步函数的函数封装,

在写代码时我们会发现有大量的重复代码,为了使代码更加简洁,我们可以将重复的代码封装为一个可以在多个部分时候用的函数。

之前写的新闻代码中,经常出现的操作有对文件的读取,我们可以将它封装为一个函数readNewsData()

function readNewsData(){
    fs.readFile(path.join(__dirname,'data','data1.json'),'utf8',function(err,data){
        if(err&&err.code!=='ENOENT'){
            throw err;
        }

        var list_news=JSON.parse(data||'[]');
        //return list;//在这样返回值是不正确的,这里返回的值是fs.readfile返回的值,不是readNewsData函数返回的值
        
    });
    return list;

}

在读取文件后返回list,但是因为有fs.readFile,fs.readFile有异步回调

当执行readNewsData函数时,先开启fs.readfile(),在开启后立即执行下面的return list;根本不会等fs.readfile将文件读完。

所以对于有异步回调的和函数,我们不能以return的形式返回值

所以:通过回调函数callback()将读取到的数据list,传递出去

function readNewsData(callback){
    fs.readFile(path.join(__dirname,'data','data1.json'),'utf8',function(err,data){
        if(err&&err.code!=='ENOENT'){
            throw err;
        }

        var list_news=JSON.parse(data||'[]');
        //通过回调函数callback()将读取到的数据list,传递出去
        callback(list_news);
    });
}

在引用的时候:原代码

else if(urlObj.pathname==='/item'&&req.method==='get'){


    fs.readFile(path.join(__dirname,'data','data1.json'),'utf8',function(err,data){
    
        if(err&&err.code!=='ENOENT'){
            
            throw err;
        }
        var model=null;

        var list_news=JSON.parse(data||'[]');

        for(var i=0;i<list_news.length;i++)
        {

            if(list_news[i].id.toString()===urlObj.query.id)
            {
                model=list_news[i];
                break;

            }
        }
        if(model)
        {
            res.render(path.join(__dirname,'views','details.html'),{item:model});
        }
        else
        {
            res.end('no found')
        }
        
    });
    

现在:

else if(urlObj.pathname==='/item'&&req.method==='get'){

readNewsData(function(list){

        for(var i=0;i<list.length;i++)
        {

            if(list[i].id.toString()===urlObj.query.id)
            {
                model=list[i];
                break;

            }
        }
        if(model)
        {
            res.render(path.join(__dirname,'views','details.html'),{item:model});
        }
        else
        {
            res.end('no found')
        }
    })

}

这样代码会少一些,而readNewsData(function(list){});里面的list就是封装函数里面callback(list)

猜你喜欢

转载自www.cnblogs.com/ellen-mylife/p/10965071.html