Nodejs中怎么实现函数的串行执行


Posted in NodeJs onMarch 02, 2019

nodejs实现函数串行执行

众所周知,nodejs是用非阻塞异步io机制,也就是说函数执行完成的先后顺序和代码的编写的先后顺序可能不同,实际的顺序取决于一个函数自身执行的快慢。这就出现一个在nodejs中怎么编写串行执行也就是顺序执行代码的问题。试想,要是你写了2个函数,一个查询数据库,另一个返回查询的结果,要是不用串行执行那么还没等数据库查询完毕就返回了结果,这显然是不行的。因而串行执行在nodejs中很有用。那么怎么实现呢?

大家可能会说,将返回查询结果的函数写在查询数据库函数的回调函数里面就好了呀,但是有过开发经验的朋友一定知道,要是情况比较复杂时就会产生一个回调地狱的问题,即层层嵌套,最后都不知道自己写了些什么,可读性和维护性很差。

我们不防换个思路,要是将这些想要顺序执行的函数放到一个数组里面,当一个函数执行完毕时在执行数组里面的下一个函数不就行了嘛。其实,nodejs开源社区中的很多串行模块的基本思想就是这个。接下来我们一步一步完成这个串行的demo:

1.首先我们定义一个保存函数执行顺序的数值:

var tasks = [];

2.再定义一个往数值里面加入串行化执行函数的函数:

function addTask(task){
     tasks.push(task);
}

3.执行数组中下一个函数的函数:

function next(){
     if(tasks.length > 0){
        tasks.shift()();
     }else{
       return;   
     }
}

ok,大功告成,接下来定义几个测试函数:

var task1 = function(){
     console.log('task1 is finished');
     next();
}
var task2 = function(){
     console.log('task2 is finished');
     next();}var task3 = function(){
     console.log('task3 is finished');
     next();
}

开始测试:

addTask(task1);
addTask(task2);
addTask(task3);
next()

Nodejs中怎么实现函数的串行执行

换个顺序:

addTask(task1);
addTask(task3);
addTask(task2);
next();

Nodejs中怎么实现函数的串行执行

ok,大功告成。基于这个思想,在实际开发中大家可以定义一个模块,将这个串行打包,再也不用害怕回调地狱问题啦。

还可以用第三方库,如async.

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

NodeJs 相关文章推荐
nodejs的10个性能优化技巧
Jul 15 NodeJs
nodejs爬虫抓取数据乱码问题总结
Jul 03 NodeJs
NodeJS遍历文件生产文件列表功能示例
Jan 22 NodeJs
Nodejs多站点切换Htpps协议详解及简单实例
Feb 23 NodeJs
实例分析nodejs模块xml2js解析xml过程中遇到的坑
Mar 18 NodeJs
详解如何在NodeJS项目中优雅的使用ES6
Apr 22 NodeJs
NodeJs的fs读写删除移动监听
Apr 28 NodeJs
NodeJS、NPM安装配置步骤(windows版本) 以及环境变量详解
May 13 NodeJs
nodejs6下使用koa2框架实例
May 18 NodeJs
NodeJS链接MySql数据库的操作方法
Jun 27 NodeJs
nodejs多版本管理总结
Apr 03 NodeJs
独立部署小程序基于nodejs的服务器过程详解
Jun 24 NodeJs
Nodejs让异步变成同步的方法
Mar 02 #NodeJs
nodejs使用async模块同步执行的方法
Mar 02 #NodeJs
NodeJS实现同步的方法
Mar 02 #NodeJs
PHPStorm中如何对nodejs项目进行单元测试详解
Feb 28 #NodeJs
Nodejs对postgresql基本操作的封装方法
Feb 20 #NodeJs
深入理解nodejs搭建静态服务器(实现命令行)
Feb 05 #NodeJs
Nodejs实现的操作MongoDB数据库功能完整示例
Feb 02 #NodeJs
You might like
PHP json格式和js json格式 js跨域调用实现代码
2012/09/08 PHP
ThinkPHP做文字水印时提示call an undefined function exif_imagetype()解决方法
2014/10/30 PHP
php ci 获取表单中多个同名input元素值的代码
2016/03/25 PHP
超棒的javascript页面顶部卷动广告效果
2007/12/01 Javascript
jQuery的初始化与对象构建之浅析
2011/04/12 Javascript
页面调用单个swf文件,嵌套出多个方法。
2011/11/21 Javascript
javascript中关于break,continue的特殊用法与介绍
2012/05/24 Javascript
S2SH整合JQuery+Ajax实现登录验证功能实现代码
2013/01/30 Javascript
本地图片预览(支持IE6/IE7/IE8/Firefox3)经验总结
2013/03/25 Javascript
jQuery去掉字符串起始和结尾的空格(多种方法实现)
2013/04/01 Javascript
javascript和jquery修改a标签的href属性
2013/12/16 Javascript
js表头排序实现方法
2015/01/16 Javascript
jquery实现鼠标滑过显示提示框的方法
2015/02/05 Javascript
60行js代码实现俄罗斯方块
2015/03/31 Javascript
JavaScript中Cookies的相关使用教程
2015/06/04 Javascript
javascript实现显示和隐藏div方法汇总
2015/08/14 Javascript
JavaScript、tab切换完整版(自动切换、鼠标移入停止、移开运行)
2016/01/05 Javascript
js获取页面及个元素高度、宽度的代码
2016/04/26 Javascript
JS实现的文字间歇循环滚动效果完整示例
2018/02/13 Javascript
详解Vue-cli webpack移动端自动化构建rem问题
2018/04/07 Javascript
基于Vue实现拖拽效果
2018/04/27 Javascript
重学JS之显示强制类型转换详解
2019/06/30 Javascript
小程序接口的promise化的实现方法
2019/12/11 Javascript
[07:20]2018DOTA2国际邀请赛寻真——逐梦Mineski
2018/08/10 DOTA
Python爬取三国演义的实现方法
2016/09/12 Python
python 把数据 json格式输出的实例代码
2016/10/31 Python
通过python+selenium3实现浏览器刷简书文章阅读量
2017/12/26 Python
python递归实现快速排序
2018/08/18 Python
python中对数据进行各种排序的方法
2019/07/02 Python
在OpenCV里实现条码区域识别的方法示例
2019/12/04 Python
Python基于pygame实现单机版五子棋对战
2019/12/26 Python
python用Tkinter做自己的中文代码编辑器
2020/09/07 Python
基于 HTML5 WebGL 实现的医疗物流系统
2019/10/08 HTML / CSS
给海归自荐信的建议
2013/12/13 职场文书
2015年医院保卫科工作总结
2015/07/23 职场文书
2016春季小学开学寄语
2015/12/03 职场文书