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.');
}
现在,代码看起来
清楚多了,不象面条了。
分享到:
相关推荐
- 回调函数:JavaScript的异步基础,理解回调地狱及其解决方案是必要的。 - Promise:Promise对象用于处理异步操作,它提供了更好的错误处理和链式调用方式。 - async/await:基于Promise的语法糖,使得异步代码...
理解回调函数、Promise、async/await的用法,能够更好地处理异步操作,避免回调地狱。 8. **模块化**:随着项目复杂度增加,模块化变得尤为重要。学习CommonJS(Node.js环境)和ES6的import/export语法,以及模块...
- **回调函数**:传统异步处理的基础,但可能导致回调地狱问题。 - **Promise**:为解决回调地狱引入的机制,提供了链式调用和错误处理的能力。 - **async/await**:基于Promise的语法糖,使异步代码更接近同步...
- **回调函数**:一种常用的异步处理方式,通过将函数作为参数传递到另一个函数中,在适当的时候调用这个函数来实现非阻塞操作。 - **Promise**:ES6中引入的一种更为优雅地处理异步操作的方式,通过`new Promise...
- **回调函数**:传统的异步处理方式之一。 - **Promise**:解决回调地狱问题的一种方案,提供了链式调用的能力。 - **async/await**:基于Promise的进一步抽象,使得异步代码更接近于同步代码的写法。 #### 7. ...
- 回调函数:JavaScript传统的异步处理方式,但可能导致回调地狱问题。 - Promise:ES6引入的解决方案,提供链式调用,改善了异步代码的可读性。 - async/await:基于Promise的语法糖,使得异步编程更接近同步...
- 回调函数:JavaScript最初的异步处理方式,但可能导致回调地狱问题。 - Promise:为解决回调地狱,Promise引入了链式调用,使得异步代码更易读和管理。 - async/await:基于Promise,提供了类似同步的写法,使...
Promise是处理异步操作的一种方式,它帮助管理复杂的回调链,使得错误处理更加直观。async/await是基于Promise的新语法,使得异步代码更接近同步风格。 十、Node.js和前端框架 JavaScript不仅用于浏览器,Node.js...
回调函数是最初的异步处理方式,但可能导致回调地狱;Promise解决了这个问题,提供了链式调用;ES6引入的async/await使得异步代码更接近同步写法。 6. **模块系统**: ES6引入了模块系统,通过`import`和`export`...
Promise和async/await的使用能帮助开发者优雅地处理异步操作,避免回调地狱。 此外,JavaScript的原型继承和类(ES6引入)提供了面向对象编程的机制。理解对象的创建、原型链、继承和构造函数,对于构建复杂的程序...
3. **Promise**:掌握Promise用于处理异步操作,解决回调地狱的问题。 4. **ES6新特性**:包括箭头函数、解构赋值、模板字符串、类和扩展运算符等。 5. **异步编程**:深入理解async/await,它是Promise的一个更...
JavaScript也有异步编程的能力,最常见的是回调函数和Promise。回调函数常用于解决耗时操作,如Ajax请求,防止程序阻塞。然而,回调地狱问题促使了Promise的出现,它提供了更优雅的链式调用处理异步方式。ES6引入了...
Koa 的出现是为了解决Express的一些痛点,例如回调函数地狱、缺乏错误处理机制以及中间件的繁琐性等问题。Koa 通过使用 ES6 的 async/await 语法糖,使得异步操作变得更加优雅,同时也提高了代码的可读性和可维护性...
1. 异步编程:理解回调函数、Promise、async/await,掌握错误处理机制,解决JavaScript的异步问题。 2.闭包:了解闭包的工作原理,以及如何利用它来封装变量和实现私有属性。 3. 原型与继承:JavaScript中的对象...
6. **Promise与async/await**:Promise用于解决异步操作中的回调地狱问题,而async/await则是Promise的语法糖,让异步代码更接近同步代码的写法,提高了可读性和易维护性。 7. **JavaScript设计模式**:单例模式、...
4. **事件循环与异步编程**:JavaScript是非阻塞的,基于事件循环和回调函数、Promise、async/await等方式处理异步任务。 5. **DOM操作**:用于操纵网页内容,包括元素的选择、添加、删除、属性修改等。 6. **AJAX...
事件驱动和回调函数是早期异步处理的主要方式,而Promise和async/await(ES6引入)则为异步编程带来了更为清晰的同步写法。 五、DOM操作 在Web开发中,JavaScript常用于操作文档对象模型(DOM),包括元素的选择、...