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.');
}
分享到:
相关推荐
前端开源库-babel-plugin-transform-async-to-promisesBabel插件将异步转换为承诺,将异步/等待转换为承诺链
akka-persistence-sql-async, 一个用于akka持久性的日志和快照存储 akka-persistence-sql-async 的日志和快照存储插件( ... Akka-persistence-sql-async执行由 scalikejdbc异步查询,它提供非阻塞api来与数据库。Akka
each-async - 异步并行迭代器(异步forEach)
节点-mplayer-异步 Linux上用于MPlayer的node.js包装器。 目前,它专注于声音播放,更多选项和视频播放将在稍后发布。 承诺依赖于强大的q库 ##用法 首先,使用以下命令安装模块(假设您已经安装了MPlayer) npm ...
前端开源库-babel-helper-remap-koa2-async-to-generatorbabel-helper-remap-koa2-async-to-generator,将异步函数转换为ES2015生成器(koav2->koav1)。
盖茨比插件React头盔异步 描述 提供对通过添加的服务器渲染数据的支持。 React Helmet Async是一个组件,可让您使用其React组件控制文档头。 使用此插件,您在其组件中添加的属性(例如标题,元属性等)将被添加到...
JavaScript异步编程指南-终极解决方案Async-Await.docx
开玩笑的序列化器React头盔异步Jest Snapshot序列化程序可在组件快照旁边可视化React头盔异步数据。安装使用npm安装预设: npm install --save-dev jest-serializer-react-helmet-async 或纱线: yarn add --dev ...
子进程异步 覆盖 Node的模块的最佳方法 child-process-async提供了对原始child_process函数的直接替代,而不仅仅是返回Promise的重复方法。 所以,当你调用exec(...)我们还是回到一个ChildProcess的实例,只...
前端开源库-fis-postprocessor-require-asyncfis后处理器require async,分析require.async的组件,并记录下来
前端开源库-babel-plugin-transform-async-to-generator-2babel-plugin-transform-async-to-generator-2是babel-plugin-transform-async到generator的一个分支,与此插件保持异步函数的原始参数名略有不同。
前端开源库-multihashing-async多哈希异步,多哈希函数
流到异步迭代器概述stream-to-async-iterator提供了一个实现Symbol.asyncIterator的包装器。 这将使流可用作异步可迭代变量,可以在for-await-of循环中使用。 支持node.js 4及更高版本。安装 $ npm install stream-...
yarn add i18next-react-native-async-storage 然后将其传递给您的i18n实例 import AsyncStoragePlugin from 'i18next-react-native-async-storage' i18n . use ( AsyncStoragePlugin ( ) ) 后备机制 如果插件无法...
前端开源库-jsdoc-strip-async-awaitjsdoc strip async wait,jsdoc plugin to strip async/wait keywords before parse.
前端开源库-node-express-json-rpc2-asyncnode-express-json-rpc2-async,基于路由的json-rpc Express中间件
Laravel开发-laravel-async-queue Laravel/Oracle的异步队列驱动程序(推到后台)
####安装npm install react-native-async-storage ####方法 ####简单的例子 ReactNativeAsyncStorage.using('model_name') .then((model) => { model.get(id); model.find(); model.add({field1: 'value...