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. 强类型DataSet的使用简明教程

    关于弱类型 DataSet的缺点: 无论何时从 DataSet检索值都是以Object类型返回,需要对它进行类型转换: 给其它开发者使用 时无法知道哪些列可用: 运行时才能知道所 有列名,数据绑定麻烦 ...

  2. Android ExpandableListView

    ExpandableListView 结合SimpleExpandableListAdapter用法 最终实现效果: activity_main.xml <?xml version=" ...

  3. Spring对Quartz的封装实现简单需注意事项

    前段时间在项目中一直使用正常的Quartz突然出现了任务漏跑的情况,由于我以前看过Quartz的内部实现,凭借记忆我觉得是由于Quartz的线程池的使用出现问题导致了故障的发生.为了搞清问题的真相,我 ...

  4. PHP学习第一天笔记——php的基本语法

    1.php嵌入到html中的方式 (1) <?php.....?> 标准风格(推荐) (2)<script language="php">......< ...

  5. Excel使用技巧总结

    Excel博大精深,此文用来记录Excel的使用技巧 1.多个单元格值添加单引号,比如:A1单元格的值为123444,添加单引号之后变为'123444',可以在B1或者其他任一空的单元格内输入公式:& ...

  6. 高效简易开发基于websocket 的通讯应用

    websocket的主要是为了解决在web上应用长连接进行灵活的通讯应用而产生,但websocket本身只是一个基础协议,对于消息上还不算灵活,毕竟websocket只提供文本和二进制流这种基础数据格 ...

  7. Asp.Net Web API 2第十课——使用OWIN自承载Web API

    详情请查看http://aehyok.com/Blog/Detail/71.html 个人网站地址:aehyok.com QQ 技术群号:206058845,验证码为:aehyok 本文文章链接:ht ...

  8. SQL SERVER 内存学习系列(一)

    最近帮客户解决发布订阅的问题时,突然遇到这样一个问题发布订阅中报下面的错误,另外执行alter table 操作时也会报错 : 问题很奇怪发布订阅和CLR有什么关系?memtoleave内存是个啥?回 ...

  9. 使用C#设计Fluent Interface

    我们经常使用的一些框架例如:EF,Automaper,NHibernate等都提供了非常优秀的Fluent Interface, 这样的API充分利用了VS的智能提示,而且写出来的代码非常整洁.我们如 ...

  10. Java多线程系列--“JUC锁”06之 Condition条件

    概要 前面对JUC包中的锁的原理进行了介绍,本章会JUC中对与锁经常配合使用的Condition进行介绍,内容包括:Condition介绍Condition函数列表Condition示例转载请注明出处 ...