node异步进阶(3)-- async写法

node异步进阶系列文章:
[url=http://xieye.iteye.com/blog/2400542]node异步进阶(1)-- 回调函数经典写法[/url]
[url=http://xieye.iteye.com/blog/2400567]node异步进阶(2)-- Promise的连续then写法[/url]
[url=http://xieye.iteye.com/blog/2400571]node异步进阶(3)-- async写法[/url]


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

[b][size=x-large]第五版(串行)[/size][/b]

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系统是我爱用的。
同样,本任务更适合并发请求文件,所以下面给出并发的版本


[b][size=x-large]第六版(并发)[/size][/b]

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.');
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值