node异步进阶系列文章:
node异步进阶(1)-- 回调函数经典写法
node异步进阶(2)-- Promise的连续then写法
node异步进阶(3)-- async写法
继续上回的任务,这次改用promise对象实现。
让我们疯狂的使用then吧
第三版 (串行)
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){
var titles;
get_file_content('/tpl/title.json') // 先抓取数据文件
.then(JSON.parse) // 这里顺便做一下解析,让我们尽情滥用node的异步吧!!
.then( function(value){
titles = value; // 把局域变量保存到上一层变量。
return '/tpl/template.html';//给下一个文件请求then传参
}).then(
get_file_content // 再抓取模板文件
).then(function (tmpl){ // tmpl是上一个promis的输出
formatHtml(titles,tmpl, res); // 调用函数全部搞定
}
).catch( function (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.');
}
我本人的电脑是windows,node8.9,测试通过,假如故意删除一个模板文件或数据文件,会在html输出程序中给定的错误。
注意到,这种写法的要点,先定义一个返回promise对象的函数,然后每个then里面放入这个函数,也可以不放,会自动被node转换成promise对象的!
这种写法中,一般都希望在一个地方处理错误,只要任意一个地方抛异常,所以就按上面的写法,把catch放在最后即可。
返回promise对象的函数的写法,把正确的输出放在resolve里即可,
每个then的输出,就是下个then的输入,代码很连贯。
尽管如此,本任务无需获取模板文件必须在数据文件后,完全可以同时请求,加快速度,于是有下面的代码:
第四版(并发)
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){
var files ={
title_fun: function (){
return get_file_content('/tpl/title.json').then(JSON.parse);
},
template_fun:function(){
return get_file_content('/tpl/template.html');
}
};
Promise.all([files.title_fun(), files.template_fun()]).then(function (results){
formatHtml(results[0],results[1], res); // 按照教材说法,这里的结果顺序一定等同all的传入顺序
}
).catch( function (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.');
}
可以看到并发请求,速度更快了,更充分利用了node的天生异步特性,充分的利用了计算机的性能。
并发的要点是all(....).then(...)这样的写法。
尽管如此,程序还是比较罗嗦,有没有更简单的写法呢?早就有了。
请继续看下一篇文章
分享到:
相关推荐
《axios实战进阶练习——基于 Vue3 + Node.js + ElementPlus 实现的联系人列表管理后台》配套后端 Nodejs 资源,如有需要可以下载运行,结合文章内容,实现文章项目。
node-v6.11.1-win-x64 亲测可用 node-v6.11.1-win-x64 亲测可用 node-v6.11.1-win-x64 亲测可用 node-v6.11.1-win-x64 亲测可用
2、node-v8.0.0-linux-x64.tar.gz 3、node.js各个版本下载连接.txt(各个版本各个系统的node.js压缩包下载连接) win-x64/ 30-May-2017 17:51 - win-x86/ 30-May-2017 17:49 - node-v8.0.0-aix-ppc64.tar.gz 30-...
node-mysql-promise 修复异步查询bug版本 Install $ npm i -D git+https://github.com/gofancyever/node-mysql-promise.git Introduction node mysql操作封装类,基于promise,借鉴75team开源项目thinkjs中model操作...
node-v12.9.1-linux-x64.tar.xz node-v12.9.1-linux-x64.tar.xz node-v12.9.1-linux-x64.tar.xz node-v12.9.1-linux-x64.tar.xz node-v12.9.1-linux-x64.tar.xz node-v12.9.1-linux-x64.tar.xz node-v12.9.1-linux-x...
nodejs dependency node-v64-linux-x64-glibc/grpc_node.node
node-v10.13.0-win-x64.zip
node-v12.14.0-x64.msi node-v12.14.0-x64.msi node-v12.14.0-x64.msi node-v12.14.0-x64.msi
报错缺少\github\eirslett\node\9.11.1\node-9.11.1-win-x64.zip 因为前端dubbo-admin-ui使用nodeJs,打包时maven需要下载一个node-9.11.1-win-x64.zip的安装包
node-v4.4.4-x86.msi
Cannot find module '/home/user/.nvm/versions/node/v8.11.3/lib/node_modules/composer-cli/node_modules/grpc/src/node/extension_binary/node-v59-linux-x64-glibc/grpc_node.node'
解决问题: Cannot find module '/home/ubuntu/.nvm/versions/node/v8.9.0/lib/node_modules/composer-cli/node_modules/grpc/src/node/extension_binary/node-v57-linux-x64-glibc/grpc_node.node'-Cannot find ...
node-v10.1.0-x64.msi 版本的 可下载 安装包 64位的 支付WIN10
node-v6.9.2-x64.msi
node-v8.11.3-x64,安装包 。
node-v6.11.2-linux-x64.tar.xznode-v6.11.2-linux-x64.tar.xznode-v6.11.2-linux-x64.tar.xznode-v6.11.2-linux-x64.tar.xz
node_v8.11.2-x64。前端开发的利器,8.11版本,64位。请看清下载。
node-v0.12.2-x64.msi 安装文件,方便查找使用。
node-v6.11.3-x64.msi node-v6.11.3-x64.msi node-v6.11.3-x64.msi node-v6.11.3-x64.msi
node-v12.14.0-x64.msi