xieye 阅读(20) 评论(0)
node异步进阶系列文章:
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.');
}



现在,代码看起来清楚多了,不象面条了。