xieye 阅读(92) 评论(0)
node异步进阶系列文章:
node异步进阶(1)-- 回调函数经典写法
node异步进阶(2)-- Promise的连续then写法
node异步进阶(3)-- async写法


继续上回的任务,这次使用全宇宙最新最炫酷的写法 async ,await

第五版(串行)
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..');
});


async function getTitles(res){
  try{
    var titles = await get_file_content('/tpl/title.json').then(JSON.parse);
    var tmpl = await get_file_content('/tpl/template.html');
    formatHtml(titles,tmpl, res);
  } catch(err) {
    hadError(err, res);          // 调用处理错误的函数。
  };
}

// 这是通用函数,异步读文件
function get_file_content(file)
{
  return new Promise(function (resolve, reject) {
    fs.readFile(__dirname+file, function(err,data){
      if (err) {
        reject(err);
      } else {
        resolve(data.toString() );
      }
    });
  });
}


//这是本程序主要逻辑,模板替换后,输出
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.');
}



可以看出,相比前面4个版本,这个版本的代码最清爽,大赞node。

特别需要提醒注意的是:
这种写法要求node的版本较新,我的是node8.9,windows系统是我爱用的。
同样,本任务更适合并发请求文件,所以下面给出并发的版本


第六版(并发)
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..');
});


async function getTitles(res){
  try{
    let [titles, tmpl] = await Promise.all([
      get_file_content('/tpl/title.json').then(JSON.parse),
      get_file_content('/tpl/template.html')
    ]);
    formatHtml(titles,tmpl, res);
  } catch(err) {
    hadError(err, res);          // 调用处理错误的函数。
  };
}

// 这是通用函数,异步读文件
function get_file_content(file)
{
  return new Promise(function (resolve, reject) {
    fs.readFile(__dirname+file, function(err,data){
      if (err) {
        reject(err);
      } else {
        resolve(data.toString() );
      }
    });
  });
}


//这是本程序主要逻辑,模板替换后,输出
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.');
}