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 ...
随机推荐
- caffe 在window下编译(windows7, cuda8.0,matlab接口编译)
1. 环境:Windows7,Cuda8.0,显卡GTX1080,Matlab2016a,VS2013 (ps:老板说服务器要装windows系统,没办法,又要折腾一番,在VS下编译好像在cuda8. ...
- Linux下Crontab命令用法
第1列分钟1-59第2列小时1-23(0表示子夜)第3列日1-31第4列月1-12第5列星期0-6(0表示星期天)第6列要运行的命令 下面是crontab的格式:分 时 日 月 星期 要运行的命令 这 ...
- 用JQuery仿造QQ头像裁剪功能
最近工作真心忙碌,几乎没时间写博客.今天趁周末来仿一个QQ头像裁剪功能插件.效果如下: 所有文件都可在我的Github上下载,从头到尾从简到繁按步骤一共分了9个HTML文件,每个步骤文件里的注释都写的 ...
- ENode 1.0 - 消息队列的设计思路
开源地址:https://github.com/tangxuehua/enode 上一篇文章,简单介绍了enode框架内部的整体实现思路,用到了staged event-driven architec ...
- Win10 UWP开发中的重复性静态UI绘制小技巧 2
小技巧1 地址:http://www.cnblogs.com/ms-uap/p/4641419.html 介绍 我们在上一篇博文中展示了通过Shape.Stroke族属性实现静态重复性UI绘制,使得U ...
- 作业三:PSP记录个人项目耗时情况
PSP2.1 Personal Software Process Stages Time Planning 计划 20min Estimate 估计开发 ...
- XSS零碎指南
该文章是本人两天的学习笔记,共享出来,跟大家交流.知识比较零散,但是对有一定 JS 基础的人来说,每个小知识都有助于开阔你的 Hack 视角.首先声明,本文只是 XSS 攻击的冰山一角,读者自行深入研 ...
- Java多线程系列--“JUC锁”06之 Condition条件
概要 前面对JUC包中的锁的原理进行了介绍,本章会JUC中对与锁经常配合使用的Condition进行介绍,内容包括:Condition介绍Condition函数列表Condition示例转载请注明出处 ...
- 在.net中使用aquiles访问Cassandra(三)
之前我们实现了如何修改数据,还需要相应的删除动作.删除方式会有几种情况,以下分别一一介绍. 1.批量删除,适应于多行多列的情况. public void Remove(string columnF ...
- [ACM_动态规划] 嵌套矩形
问题描述:有n个矩阵,每个矩阵可以用两个整数a,b来表示 ,表示他的长和宽,矩阵X (a,b) 可以 嵌套 到Y (c,d) 里面当且仅当 a < c && b < d ...