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 ...
随机推荐
- 用CSS3的transform来做一个立方体
有一次上数据结构课老师布置了一个用队列的思想通过js和Html来做一个“跳舞配对”的网页,当时那个跳舞的部分用了css3里面transform的相关属性做了个个让图片无限翻转的效果,可能正是由于这个效 ...
- oracle 11g install linux
#!/bin/bash#Purpose:Create and config oracle install.#Usage:Log on as the superuser('root') #1.creat ...
- Code::Blocks配置GTK+2和GTK+3
Code::Blocks配置GTK+2和GTK+3 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根 ...
- 由 s:hidden 引起的文本框内容不能传到 struts的Action中
<s:form id="startForm" name ="startForm" action="/hall/hall_startList.do ...
- 基于jquery的图片轮播 (IE8以上)
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- [后端人员耍前端系列]AngularJs篇:30分钟快速掌握AngularJs
一.前言 对于前端系列,自然少不了AngularJs的介绍了.在前面文章中,我们介绍了如何使用KnockoutJs来打造一个单页面程序,后面一篇文章将介绍如何使用AngularJs的开发一个单页面应用 ...
- js操作Dom的一些方法简化
众所周知JQ的选择符很强大,一些看起来很难实现的功能只要在$符号中传入简单的字符串就可以获取到各种层级关系的DOM,而却不用考虑浏览器的兼容性.但有时候在做小项目的时候并不需要引入JQ,而又不想频繁繁 ...
- Java虚拟机4:内存溢出
堆溢出 Java堆唯一的作用就是存储对象实例,只要保证不断创建对象并且对象不被回收,那么对象数量达到最大堆容量限制后就会产生内存溢出异常了.所以测试的时候把堆的大小固定住并且让堆不可扩展即可.测试代码 ...
- 在WebApi中基于Owin OAuth使用授权发放Token
如何基于Microsoft.Owin.Security.OAuth,使用Client Credentials Grant授权方式给客户端发放access token? Client Credentia ...
- AMD加载器实现笔记(五)
前几篇文章对AMD规范中的config属性几乎全部支持了,这一节主要是进一步完善.到目前为止我们的加载器还无法处理环形依赖的问题,这一节就是解决环形依赖. 所谓环形依赖,指的是模块A的所有依赖项的依赖 ...