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

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

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

0
0
分享到:
评论

相关推荐

    CMSC100-Lec-Async-Programming

    这使得异步代码更接近同步的写法,提高了可读性。配合yield*和co库,Generator可以方便地驱动Promise链。 4. async/await:这是ES7引入的新特性,基于Promise,使得异步代码更加简洁和易读。async函数总是返回一个...

    Node.js-用于Node.js应用程序的SQLite客户端库和基于SQL的迁移API

    这里的ES6 Promise和ES7 async/await是JavaScript中处理异步操作的两种方式,Promise用于链式处理异步操作,而async/await则提供了一种更接近同步代码的写法,使代码更易读和维护。Babel是一个广泛使用的工具,它...

    node 8.11.3 linux x64

    4. 更强大的异步处理:Node.js 8.x引入了async/await语法,这是基于Promise的异步编程的一种更简洁的写法,可以有效避免回调地狱,提高代码可读性。 5. npm 5.6.0改进:此版本的npm提供了更快的安装速度、更好的...

    详解Node.js异步处理的各种写法

    在本文中,我们将深入探讨Node.js异步处理的几种常见方法,包括回调函数、事件驱动以及基于Promise和async/await的现代异步编程模式。 首先,我们来看**回调函数**。这是Node.js早期处理异步操作的主要方式。例如,...

    Node.js-饿了么拼手气红包辅助一键领取手气最佳红包

    2. **JavaScript 编程**:掌握 JavaScript 的基本语法,包括变量、函数、数组、对象等,并理解异步编程的概念,如回调函数、Promise 和 async/await。 3. **网络请求**:通过 Node.js 发送 HTTP 请求,可能使用到第...

    harmonyos2-runkoa:DEPRECATEDrunkoa:使用koa1和koa2的时候,不用在意babel的细节,无论哪种写法(c

    "babel-preset-stage-3": "^6.5.0", "babel-plugin-add-module-exports": "^0.1.2", Features if use node v7.x,runkoa is an alias with node --harmony-async-await 不需要了解babel即可使用koa2+async组合 对koa...

    异步处理代码

    例如,`async/await`语法使得异步代码更接近同步的写法,提高了代码的可读性和可维护性。 Python中,可以使用`asyncio`库进行异步编程。`async`和`await`关键字与JavaScript类似,定义异步函数和等待异步操作。此外...

    浅谈Express异步进化史

    在JavaScript的世界,异步编程是不可或缺的一部分,尤其是在Node.js环境中,由于其单线程特性,异步处理显得尤为重要。Express作为Node.js中最受欢迎的Web服务器框架之一,自然而然地需要面对和处理各种异步操作。...

    详谈nodejs异步编程

    Node.js异步编程是利用JavaScript的异步编程能力,处理在服务器端可能出现的大量I/O操作而不阻塞执行线程的技术。在Node.js环境中,由于其单线程的特性,异步编程尤为重要,它使得程序能够以非阻塞的方式执行I/O操作...

    前端开源库-amocha

    // 使用amocha的async/await写法 it('测试异步操作', async () =&gt; { const result = await someAsyncFunction(); expect(result).toBe('expected value'); }); ``` **3. 安装与使用** 要在项目中使用`amocha`,...

    JavaScript学习

    - Promise和async/await:用于异步编程,解决回调地狱问题。 - fetch API:现代浏览器的异步请求方法,返回Promise。 8. **闭包** - 闭包的概念和作用,以及如何创建闭包。 - 闭包在内存管理中的作用,防止内存...

    devclass-apn-01:Node.js 中的异步编程

    async/await则是基于Promise的一种更优雅的写法,它允许我们使用类似同步代码的方式来编写异步逻辑,提高了代码的可读性和可维护性。 在Node.js中,常见的异步I/O操作包括文件系统操作(fs模块)、网络通信(http或...

    JavaScript进阶第一天.zip

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

    JS面试视频.txt

    - **async/await**:基于Promise的进一步抽象,使得异步代码更接近于同步代码的写法。 #### 7. AJAX - **概念**:异步JavaScript和XML,一种无需重新加载整个网页即可更新部分网页的技术。 - **实现方式**:通过...

    狂神说系列 JavaScript笔记

    - async/await:基于Promise的语法糖,使得异步代码更接近同步写法,提高了可读性。 7. **ES6及以后的新特性** - 类与继承:ES6引入了类的语法糖,以及基于prototype的继承机制。 - 解构赋值:方便地从数组或...

    前端开源库-es6-promisify-all

    这种方式更加接近同步代码的写法,让异步代码看起来就像同步执行一样,降低了理解和调试的难度。 总的来说,`es6-promisify-all` 是前端开发中处理异步操作的一个实用工具,它使得开发者能够更好地利用 ES6 的 ...

    李炎恢js笔记

    - **async/await**:基于Promise的语法糖,使异步代码更接近同步编程的写法。 6. **事件与DOM操作** - **事件模型**:了解DOM事件的冒泡、捕获和DOM2级事件处理。 - **事件处理函数**:addEventListener和...

Global site tag (gtag.js) - Google Analytics