`
xieye
  • 浏览: 834896 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

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

阅读更多
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.');
}



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

0
0
分享到:
评论

相关推荐

    狂神说系列 JavaScript笔记

    - 回调函数:JavaScript的异步基础,理解回调地狱及其解决方案是必要的。 - Promise:Promise对象用于处理异步操作,它提供了更好的错误处理和链式调用方式。 - async/await:基于Promise的语法糖,使得异步代码...

    JavaScript进阶第一天.zip

    理解回调函数、Promise、async/await的用法,能够更好地处理异步操作,避免回调地狱。 8. **模块化**:随着项目复杂度增加,模块化变得尤为重要。学习CommonJS(Node.js环境)和ES6的import/export语法,以及模块...

    李炎恢js笔记

    - **回调函数**:传统异步处理的基础,但可能导致回调地狱问题。 - **Promise**:为解决回调地狱引入的机制,提供了链式调用和错误处理的能力。 - **async/await**:基于Promise的语法糖,使异步代码更接近同步...

    精通JavaScript.pdf 高清下载

    - **回调函数**:一种常用的异步处理方式,通过将函数作为参数传递到另一个函数中,在适当的时候调用这个函数来实现非阻塞操作。 - **Promise**:ES6中引入的一种更为优雅地处理异步操作的方式,通过`new Promise...

    JS面试视频.txt

    - **回调函数**:传统的异步处理方式之一。 - **Promise**:解决回调地狱问题的一种方案,提供了链式调用的能力。 - **async/await**:基于Promise的进一步抽象,使得异步代码更接近于同步代码的写法。 #### 7. ...

    javascript知识大全

    - 回调函数:JavaScript传统的异步处理方式,但可能导致回调地狱问题。 - Promise:ES6引入的解决方案,提供链式调用,改善了异步代码的可读性。 - async/await:基于Promise的语法糖,使得异步编程更接近同步...

    笔记

    - 回调函数:JavaScript最初的异步处理方式,但可能导致回调地狱问题。 - Promise:为解决回调地狱,Promise引入了链式调用,使得异步代码更易读和管理。 - async/await:基于Promise,提供了类似同步的写法,使...

    javascript学习必备帮助文档

    Promise是处理异步操作的一种方式,它帮助管理复杂的回调链,使得错误处理更加直观。async/await是基于Promise的新语法,使得异步代码更接近同步风格。 十、Node.js和前端框架 JavaScript不仅用于浏览器,Node.js...

    erik-schroeder

    回调函数是最初的异步处理方式,但可能导致回调地狱;Promise解决了这个问题,提供了链式调用;ES6引入的async/await使得异步代码更接近同步写法。 6. **模块系统**: ES6引入了模块系统,通过`import`和`export`...

    JavaScript 帮助 学习 文档

    Promise和async/await的使用能帮助开发者优雅地处理异步操作,避免回调地狱。 此外,JavaScript的原型继承和类(ES6引入)提供了面向对象编程的机制。理解对象的创建、原型链、继承和构造函数,对于构建复杂的程序...

    JavaScript 入门及深入运用

    3. **Promise**:掌握Promise用于处理异步操作,解决回调地狱的问题。 4. **ES6新特性**:包括箭头函数、解构赋值、模板字符串、类和扩展运算符等。 5. **异步编程**:深入理解async/await,它是Promise的一个更...

    javascript-learning

    JavaScript也有异步编程的能力,最常见的是回调函数和Promise。回调函数常用于解决耗时操作,如Ajax请求,防止程序阻塞。然而,回调地狱问题促使了Promise的出现,它提供了更优雅的链式调用处理异步方式。ES6引入了...

    koa-casts:Udemy课程的Koa源代码存储库

    Koa 的出现是为了解决Express的一些痛点,例如回调函数地狱、缺乏错误处理机制以及中间件的繁琐性等问题。Koa 通过使用 ES6 的 async/await 语法糖,使得异步操作变得更加优雅,同时也提高了代码的可读性和可维护性...

    Learning-JavaScript

    1. 异步编程:理解回调函数、Promise、async/await,掌握错误处理机制,解决JavaScript的异步问题。 2.闭包:了解闭包的工作原理,以及如何利用它来封装变量和实现私有属性。 3. 原型与继承:JavaScript中的对象...

    day2.3-coderscript

    6. **Promise与async/await**:Promise用于解决异步操作中的回调地狱问题,而async/await则是Promise的语法糖,让异步代码更接近同步代码的写法,提高了可读性和易维护性。 7. **JavaScript设计模式**:单例模式、...

    lord

    4. **事件循环与异步编程**:JavaScript是非阻塞的,基于事件循环和回调函数、Promise、async/await等方式处理异步任务。 5. **DOM操作**:用于操纵网页内容,包括元素的选择、添加、删除、属性修改等。 6. **AJAX...

    201505:2015年第五期正式课

    事件驱动和回调函数是早期异步处理的主要方式,而Promise和async/await(ES6引入)则为异步编程带来了更为清晰的同步写法。 五、DOM操作 在Web开发中,JavaScript常用于操作文档对象模型(DOM),包括元素的选择、...

    javascripting

    9. **异步编程**:JavaScript中的异步编程通常通过回调函数、Promise和async/await实现,用于处理非阻塞的I/O操作。 10. **ES6及后续版本新特性**:例如模板字符串、解构赋值、类(class)、模块(import/export)...

Global site tag (gtag.js) - Google Analytics