nodejs 回调地狱解决 promise async
nodejs毁掉地狱是一直被人诟病的,以下总结一下解决毁掉地狱的一些方法。(暂时研究的比较浅)
1.promise
promise模式在任何时刻都处于以下三种状态之一:未完成(unfulfilled)、已完成(resolved)和拒绝(rejected)。以CommonJS Promise/A 标准为例,promise对象上的then方法负责添加针对已完成和拒绝状态下的处理函数。then方法会返回另一个promise对象,以便于形成promise管道,这种返回promise对象的方式能够支持开发人员把异步操作串联起来,如then(resolvedHandler, rejectedHandler); 。resolvedHandler 回调函数在promise对象进入完成状态时会触发,并传递结果;rejectedHandler函数会在拒绝状态下调用。(其中rejectedHandler可选)。
以下为一个有几级嵌套的函数,看起来比较令人恶心。(如果换成缩进四个字符可想而知)
'use strict';
const md = require('markdown-it')();
const fs = require('fs');
fs.watchFile('nodejs.md', (curr, prev) => {
let mdStr = fs.readFile('./nodejs.md', 'utf-8', (err, data) => {
let mdData = md.render(data);
let htmlTemplate = fs.readFile('./index.html', 'utf-8', (err, data) => {
let html = data.replace('{{content}}', mdData);
console.log(mdData);
fs.writeFile('./nodejs.html', html, 'utf-8', (err, data) => {
if (err) {
throw err;
} else {
console.log('OK');
}
});
});
});
});
一下用promise的方式实现同样的效果,首先把异步函数封装一下,然后下面可以指教调用。可能看起来代码比之前的版本更多,但是封装的异步函数是可以复用的。等任务多了就不显得代码多了。(但看最后调用函数的部分是不是优雅了不少)
'use strict';
const fs = require('fs');
const md = require('markdown-it')();
var Q = require('q'); function fs_readFile(file, encoding) { var deferred = Q.defer();
fs.readFile(file, encoding, function(err, data) {
if (err) deferred.reject(err); // rejects the promise with `er` as the reason
else
deferred.resolve(data) // fulfills the promise with `data` as the value
});
return deferred.promise; // the promise is returned
} function fs_writeFile(file, data, encoding) {
var deferred = Q.defer();
fs.writeFile(file, data, encoding, function(err, data) {
if (err) deferred.reject(err); // rejects the promise with `er` as the reason
else deferred.resolve(data); // fulfills the promise with `data` as the value
});
return deferred.promise ;// the promise is returned
//return 1; // the promise is returned
} function fs_watchFile(file, curr, prev) {
var deferred = Q.defer();
fs.watchFile(file, function(curr, prev) {
if (!prev) deferred.reject(err); // rejects the promise with `er` as the reason
else deferred.resolve(curr); // fulfills the promise with `data` as the value
});
return deferred.promise // the promise is returned
} function markdowm_convert(file, encoding, mdData) { var convertData = md.render(mdData);
console.log(convertData);
var deferred = Q.defer();
fs.readFile(file, encoding, function(err, data) {
if (err) deferred.reject(err); // rejects the promise with `er` as the reason
else {
data = data.replace('{{content}}', convertData);
deferred.resolve(data); // fulfills the promise with `data` as the value
}
})
return deferred.promise; // the promise is returned
} // ===============promise实现 =====================
fs_watchFile('nodejs.md')
.then(function() {
return fs_readFile('./nodejs.md', 'utf-8');
})
.then(function(mdData) {
return markdowm_convert('./index.html', 'utf-8', mdData);
})
.then(function(data) {
fs_writeFile('./nodejs.html', data, 'utf-8');
});
2.async
node的async包有多的数不清的方法我暂时只实验了一个waterfall
waterfall瀑布流的意思和async中另一个函数series差不多都是按照顺序执行,不同之处是waterfall每执行完一个函数都会产生一个值,然后把这个值给下一个函数用。
以下是嵌套了两级的读写文件程序
fs.readFile('01.txt','utf-8',function(err,date){
fs.writeFile('02.txt',date,'utf-8',function(err,date){
console.log('复制完了');
});
})
用async.waterfall 后代码如下
async.waterfall([
function(cb){
fs.readFile('01.txt','utf-8',function(err,result){
cb(err,result);
}); },function(result,cb){
fs.writeFile('02.txt',result,'utf-8',function(err,result){
cb(err,result);
});
}
],function(err,result){
console.log('复制完了');
})
另外最近学习了generator及node co库的源码分析。详见这里
nodejs 回调地狱解决 promise async的更多相关文章
- js中promise解决callback回调地狱以及使用async+await异步处理的方法
1.callback回调地狱 function ajax(fn) { setTimeout(()=> { console.log('你好') fn() }, 1000) } ajax(() =& ...
- javascript回调地狱真的只能Promise来解决吗?js回调地狱,Promise。
javascript的灵活在于函数可以当作函数的参数来传递,以及它的异步回调思想.但是这就带了一个很严重的问题,那就是回调次数过多,会影响代码结构,多层嵌套影响代码的可阅读性,也不便于书写. 举个例子 ...
- 微信小程序:用 Promise 解决方案代替回调地狱。 修复 this._invokeMethod is not a function 的问题
/** * 将回调地狱转换为 Promise 形式 * https://blog.csdn.net/SEAYEHIN/article/details/88663740 * raw: wx.downlo ...
- JavaScript中的回调地狱及解决方法
1.回调地狱 在使用JavaScript时,为了实现某些逻辑经常会写出层层嵌套的回调函数,如果嵌套过多,会极大影响代码可读性和逻辑,这种情况也被成为回调地狱.比如说你要把一个函数 A 作为回调函数,但 ...
- promise处理回调地狱
promise 异步调用 异步结果分析 定时任务 ajax 自定义事件函数 多次异步调用依赖分析(promise 应用场景) 多次异步调用结果顺序不确定问题 $.ajax({ url: 'http:l ...
- 【JavaScript】 使用Async 和 Promise 完美解决回调地狱
很久以前就学习过Async和Promise,但总是一知半解的. 今天在写NodeJS的时候,发现好多第三方库使用回调,这样在实际操作中会出现多重回调,这就是传说中的JS回调地狱. 举个例子 有一个方法 ...
- async + promise 解决回调地狱
// 解决异步回调地狱的方案: async + promise async function writeFile() { // 打开文件 const fd = await new Promis ...
- Ajax请求回调地狱及解决方案(promise、async和await)
谈及回调地狱发生得情况和解决办法,就必须追溯到原生ajax请求. 先列出服务器提供的数据接口: // 服务器端接口 app.get('/data1', (req, res) => { res.s ...
- js中的回调函数 和promise解决异步操作中的回调地狱问题。
回调函数 : 函数作为参数传递到另外一个函数中.简单数据类型和引入数据类型中的数组和对象作为参数传递大家肯定都不陌生,其实引用数据类型中的函数也是可以的. 事实上大家见到的很多,用到的也很多,比如jQ ...
随机推荐
- unity 计时器
2017年1月3号,周二,晴. //设置时间 float tempTime = 5; void OnGUI(){ //设置显示 GUI.Label (new Rect(100,100,100,100) ...
- (转)linux服务器安全配置攻略
引言: 最小的权限+最少的服务=最大的安全 所以,无论是配置任何服务器,我们都必须把不用的服务关闭.把系统权限设置到最小话,这样才能保证服务器最大的安全.下面是CentOS服务器安全设置,供大家参考. ...
- Linux磁盘管理
本系列的博客来自于:http://www.92csz.com/study/linux/ 在此,感谢原作者提供的入门知识 这个系列的博客的目的在于将比较常用的liunx命令从作者的文章中摘录下来,供自己 ...
- 不写1行代码,在Mac上体验ASP.NET 5的最简单方法
昨天微软发布了ASP.NET 5 beta2(详见ASP.NET 5 Beta2 发布),对ASP.NET 5的好奇心又被激发了. 今天下午在Mac OS X上体验了一下ASP.NET 5,而且借助Y ...
- 我的ORM之七-- 权限
我的ORM索引 权限范围 权限可以控制以下部分: 页面 按钮 表格列 (未完成) 菜单表的行 其中: 页面权限,需要在程序请求之前进行判断. 按钮权限,表格列权限,需要在请求页面之后,通过JavaSc ...
- 《你必须知道的.NET》读书笔记:方法表初窥
一.窥探准备工作 public class Base { public void M() { Console.WriteLine("M in Base"); } public vi ...
- 曲演杂坛--特殊字符/生僻字与varchar
对于中文版的SQL SERVER,默认安装后使用的默认排序规则为Chinese_PRC_CI_AS,在此排序规则下,使用varchar类型来可以“正常存取”存放中文字符以及一些东南亚国家的字符,同时v ...
- FB引擎系列-之CloudSand
CloudSand,欲打破之前的集中版本制作的模式, http://code.taobao.org/p/cloudsand包含服务器端代码(php)和客户端代码(unity) EasyDown的时 ...
- .net版本发展历史
最近装上了VS2013,发现好多新特性.新功能,公司办公还在使用VS2005.VS2008,不过用着也很顺手,在最新版Visual Studio中,微软加入了git源码管理工具,和之前的TFS大体上类 ...
- 为什么PCB上的单端阻抗控制50欧姆
很多刚接触阻抗的人都会有这个疑问,为什么常见的板内单端走线都是默认要求按照50欧姆来管控而不是40欧姆或者60欧姆?这是一个看似简单但又不 好回答的问题.在写这篇文章前我们也查找了很多资料,其中最有知 ...