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的更多相关文章

  1. js中promise解决callback回调地狱以及使用async+await异步处理的方法

    1.callback回调地狱 function ajax(fn) { setTimeout(()=> { console.log('你好') fn() }, 1000) } ajax(() =& ...

  2. javascript回调地狱真的只能Promise来解决吗?js回调地狱,Promise。

    javascript的灵活在于函数可以当作函数的参数来传递,以及它的异步回调思想.但是这就带了一个很严重的问题,那就是回调次数过多,会影响代码结构,多层嵌套影响代码的可阅读性,也不便于书写. 举个例子 ...

  3. 微信小程序:用 Promise 解决方案代替回调地狱。 修复 this._invokeMethod is not a function 的问题

    /** * 将回调地狱转换为 Promise 形式 * https://blog.csdn.net/SEAYEHIN/article/details/88663740 * raw: wx.downlo ...

  4. JavaScript中的回调地狱及解决方法

    1.回调地狱 在使用JavaScript时,为了实现某些逻辑经常会写出层层嵌套的回调函数,如果嵌套过多,会极大影响代码可读性和逻辑,这种情况也被成为回调地狱.比如说你要把一个函数 A 作为回调函数,但 ...

  5. promise处理回调地狱

    promise 异步调用 异步结果分析 定时任务 ajax 自定义事件函数 多次异步调用依赖分析(promise 应用场景) 多次异步调用结果顺序不确定问题 $.ajax({ url: 'http:l ...

  6. 【JavaScript】 使用Async 和 Promise 完美解决回调地狱

    很久以前就学习过Async和Promise,但总是一知半解的. 今天在写NodeJS的时候,发现好多第三方库使用回调,这样在实际操作中会出现多重回调,这就是传说中的JS回调地狱. 举个例子 有一个方法 ...

  7. async + promise 解决回调地狱

    // 解决异步回调地狱的方案: async + promise async function writeFile() {   // 打开文件   const fd = await new Promis ...

  8. Ajax请求回调地狱及解决方案(promise、async和await)

    谈及回调地狱发生得情况和解决办法,就必须追溯到原生ajax请求. 先列出服务器提供的数据接口: // 服务器端接口 app.get('/data1', (req, res) => { res.s ...

  9. js中的回调函数 和promise解决异步操作中的回调地狱问题。

    回调函数 : 函数作为参数传递到另外一个函数中.简单数据类型和引入数据类型中的数组和对象作为参数传递大家肯定都不陌生,其实引用数据类型中的函数也是可以的. 事实上大家见到的很多,用到的也很多,比如jQ ...

随机推荐

  1. 如何为Eclipse安装主题(Color Theme)

    Eclipse开发环境默认都是白底黑字的,看到同事的Xcode中设置的黑灰色背景挺好看的,就去网上查了一下.发现Eclipse也可以设置主题. 方法1:你可以从Eclipse Marketplace中 ...

  2. String、String.valueOf、toString 它们三者的区别总结

    今天在使用这个的时候发现,他们三者好像在某些场所都是可以用的,但是不免会让人想到那既然它们三者这么的相似,那么总有些什么区别吧.我也在网上找了一些资料看.自己也看了API文档,就将他们三的区别总结一下 ...

  3. JDK 对应的设计模式

    一.设计模式是什么 (1)反复出现问题的解决方案 (2)增强软件的灵活性 (3)适应软件不断变化二.学习JDK中设计模式的好处 (1)借鉴优秀代码的设计,有助于提高代码设计能力 (2)JDK的设计中体 ...

  4. windows下PHP与Apache的安装配置

    1.下载安装apache:官网 http://httpd.apache.org/download.cgi#apache24 下载httpd-2.2.25-win32-x86-no_ssl.msi并安装 ...

  5. Storm-源码分析- Storm中Zookeeper的使用

    在backtype.storm.cluster.clj中, 定义了storm对于Zookeeper的使用   ClusterState 首先定义操作Zookeeper集群的interface (def ...

  6. ENode 2.0 - 整体架构介绍

    前言 今天是个开心的日子,又是周末,可以轻轻松松的写写文章了.去年,我写了ENode 1.0版本,那时我也写了一个分析系列.经过了大半年的时间,我对第一个版本做了很多架构上的改进,最重要的就是让ENo ...

  7. ENode 1.0 - 事件驱动架构(EDA)思想的在框架中如何体现

    开源地址:https://github.com/tangxuehua/enode 上一篇文章,我给大家分享了我的一个基于DDD以及EDA架构的框架enode,但是只是介绍了一个大概.接下来我准备用很多 ...

  8. Java多线程11:ReentrantLock的使用和Condition

    ReentrantLock ReentrantLock,一个可重入的互斥锁,它具有与使用synchronized方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大. Reentran ...

  9. [我给Unity官方视频教程做中文字幕]beginner Graphics – Lessons系列之灯光介绍Lights

    [我给Unity官方视频教程做中文字幕]beginner Graphics – Lessons系列之灯光介绍Lights 既上一篇分享了中文字幕的摄像机介绍Cameras后,本篇分享一下第2个已完工的 ...

  10. common-dbcp2数据库连接池参数说明

    参数 默认值 描述 建议值 DefaultAutoCommit  null 通过这个池创建连接的默认自动提交状态.如果不设置,则setAutoCommit 方法将不被调用.  true Default ...