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中启用ECMAScript 6小结(windos以及Linux)
Jul 15 NodeJs
基于NodeJS的前后端分离的思考与实践(一)全栈式开发
Sep 26 NodeJs
nodejs实现的一个简单聊天室功能分享
Dec 06 NodeJs
NodeJS与HTML5相结合实现拖拽多个文件上传到服务器的实现方法
Jul 26 NodeJs
nodejs实现截取上传视频中一帧作为预览图片
Dec 10 NodeJs
nodejs基于express实现文件上传的方法
Mar 19 NodeJs
nodeJS模块简单用法示例
Apr 21 NodeJs
nodejs 如何手动实现服务器
Aug 20 NodeJs
CentOS7中源码编译安装NodeJS的完整步骤
Oct 13 NodeJs
基于Koa(nodejs框架)对json文件进行增删改查的示例代码
Feb 02 NodeJs
nodejs使用node-xlsx生成excel的方法示例
Aug 22 NodeJs
nodejs利用readline提示输入内容实例代码
Jul 15 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修改时间格式的代码
2011/05/29 PHP
推荐几款用 Sublime Text 开发 Laravel 所用到的插件
2014/10/30 PHP
php程序总是提示验证码输入有误解决方案
2015/01/07 PHP
微信支付开发订单查询实例
2016/07/12 PHP
php源码的使用方法讲解
2019/09/26 PHP
PHP设计模式入门之迭代器模式原理与实现方法分析
2020/04/26 PHP
javascript-简单的计算器实现步骤分解(附图)
2013/05/30 Javascript
非html5实现js版弹球游戏示例代码
2013/09/22 Javascript
jquery trigger伪造a标签的click事件取代window.open方法
2014/06/23 Javascript
深入分析escape()、encodeURI()、encodeURIComponent()的区别及示例
2014/08/04 Javascript
浅谈Javascript线程及定时机制
2015/07/02 Javascript
jQuery实现监控页面所有ajax请求的方法
2015/12/10 Javascript
学做Bootstrap的第一个页面
2016/05/15 HTML / CSS
全面解析多种Bootstrap图片轮播效果
2016/05/27 Javascript
Bootstrap Table使用整理(四)之工具栏
2017/06/09 Javascript
基于Vue框架vux组件库实现上拉刷新功能
2017/11/28 Javascript
JavaScript实现简单的文本逐字打印效果示例
2018/04/12 Javascript
详解ajax的data参数错误导致页面崩溃
2018/04/30 Javascript
详解webpack的proxyTable无效的解决方案
2018/06/15 Javascript
NodeJs项目中关闭ESLint的方法
2018/08/09 NodeJs
解决Layui数据表格显示无数据提示的问题
2019/11/14 Javascript
如何手写一个简易的 Vuex
2020/10/10 Javascript
[01:14:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS Orenda
2014/05/22 DOTA
Python设计模式之单例模式实例
2014/04/26 Python
Python 实现数据结构-堆栈和队列的操作方法
2019/07/17 Python
python3 批量获取对应端口服务的实例
2019/07/25 Python
Python reduce函数作用及实例解析
2020/05/08 Python
python 实现关联规则算法Apriori的示例
2020/09/30 Python
python 逆向爬虫正确调用 JAR 加密逻辑
2021/01/12 Python
HTML5触摸事件演化tap事件介绍
2016/03/25 HTML / CSS
京东全球售:直邮香港,澳门,台湾,美国,澳大利亚等地区
2017/09/24 全球购物
商务会议邀请函
2014/01/09 职场文书
优秀乡村医生先进事迹材料
2014/08/23 职场文书
借款协议书
2014/09/16 职场文书
大学生自我鉴定怎么写
2019/05/07 职场文书
详解PHP服务器如何在有限的资源里最大提升并发能力
2021/05/25 PHP