标签:news break 部分 file 操作 call tostring || 新闻
在写代码时我们会发现有大量的重复代码,为了使代码更加简洁,我们可以将重复的代码封装为一个可以在多个部分时候用的函数。
之前写的新闻代码中,经常出现的操作有对文件的读取,我们可以将它封装为一个函数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)
标签:news break 部分 file 操作 call tostring || 新闻
原文地址:https://www.cnblogs.com/ellen-mylife/p/10965071.html