node异步进阶(1)-- 回调函数经典写法
node异步进阶(2)-- Promise的连续then写法
node异步进阶(3)-- async写法
假设有一个简单需求,一个http服务器,只能访问首页,服务器返回一个模板,内容有一个json文件提供。
第一版
所有代码如下:
// 这是app.js var http = require('http'); var fs = require('fs'); http.createServer(function(req,res){ if (req.url=='/') { fs.readFile(__dirname+'/tpl/title.json', function(err,data){ if (err) { console.error(err); res.end('server error.'); } else { var titles = JSON.parse(data.toString()); fs.readFile(__dirname+'/tpl/template.html', function(err,data){ if (err) { console.error(err); res.end('server error.'); } else { var tmpl = data.toString(); var html = tmpl.replace('%', ' <li > ' +titles.join('</li > <li >') +' </li > ' ); res.writeHead(200,{'Content-Type':'text/html;charset=utf-8'}); res.end(html); } }) } }); } }).listen(80,function(){ console.log('server start..'); });
tpl目录下两个文件
这是 title.json文件,提供数据
[ "标题1", "标题2", "标题3" ]
这是template.html模板文件
引用
<html>
<body>
<ul>
%
</ul>
</body>
</html>
执行node app.js,浏览器打开 输入网址 localhost 返回结果如下:
标题1 标题2 标题3
第二版
这里的代码都是正确的,当然了,都是教科书上的,肯定正确。
但是回调有三层。下面通过创建函数,来减少嵌套。也是教科书式的修改(因为就是抄书上的代码)哦。
var http = require('http'); var fs = require('fs'); http.createServer(function(req,res){ if (req.url=='/') { getTitles(res); } }).listen(80,function(){ console.log('server start..'); }); function getTitles(res){ fs.readFile(__dirname+'/tpl/title.json', function(err,data){ if (err) { hadError(err, res); } else { getTemplate(JSON.parse(data.toString()) , res); } }); } function getTemplate(titles, res){ fs.readFile(__dirname+'/tpl/template.html', function(err,data){ if (err) { hadError(err, res); } else { formatHtml(titles,data.toString(), res); } }); } function formatHtml(titles,tmpl, res) { var html = tmpl.replace('%', ' <li > ' +titles.join('</li > <li >') +' </li > ' ); res.writeHead(200,{'Content-Type':'text/html;charset=utf-8'}); res.end(html); } function hadError(err, res) { console.log(err); res.end('server error.'); }
现在,代码看起来 清楚多了,不象面条了。