node异步进阶(1)-- 回调函数经典写法

本文通过构建HTTP服务器并展示如何处理异步操作,逐步优化代码结构,从简单的回调函数到函数模块化,使代码更清晰易读。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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]


假设有一个简单需求,一个http服务器,只能访问首页,服务器返回一个模板,内容有一个json文件提供。

[b][size=x-large]第一版[/size][/b]
所有代码如下:

// 这是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模板文件
[quote]
<html>
<body>
<ul>
%
</ul>
</body>
</html>
[/quote]

执行node app.js,浏览器打开 输入网址 localhost 返回结果如下:

标题1
标题2
标题3


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

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



现在,代码看起来[b]清楚[/b]多了,不象面条了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值