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的前后端分离的思考与实践(五)多终端适配
Sep 26 NodeJs
nodejs教程之异步I/O
Nov 21 NodeJs
nodejs中简单实现Javascript Promise机制的实例
Dec 06 NodeJs
简单好用的nodejs 爬虫框架分享
Mar 26 NodeJs
nodejs个人博客开发第七步 后台登陆
Apr 12 NodeJs
ajax +NodeJS 实现图片上传实例
Jun 06 NodeJs
Windows下快速搭建NodeJS本地服务器的步骤
Aug 09 NodeJs
基于nodejs实现微信支付功能
Dec 20 NodeJs
NodeJs项目中关闭ESLint的方法
Aug 09 NodeJs
CentOS7中源码编译安装NodeJS的完整步骤
Oct 13 NodeJs
nodejs中各种加密算法的实现详解
Jul 11 NodeJs
nodejs使用Sequelize框架操作数据库的实现
Oct 21 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
DC这些乐高系列动画电影你看过几部?
2020/04/09 欧美动漫
德生PL550的电路分析
2021/03/02 无线电
PHP stristr() 函数(不区分大小写的字符串查找)
2010/06/03 PHP
PHP无刷新上传文件实现代码
2011/09/19 PHP
PHP中把stdClass Object转array的几个方法
2014/05/08 PHP
IIS6.0 开启Gzip方法及PHP Gzip函数分享
2014/06/08 PHP
PHP验证终端类型是否为手机的简单实例
2017/02/07 PHP
两个SUBMIT按钮,如何区分处理
2006/08/22 Javascript
jquery下为Event handler传递动态参数的代码
2011/01/06 Javascript
jquery插件开发注意事项小结
2013/06/04 Javascript
JavaScript判断undefined类型的正确方法
2015/06/30 Javascript
EasyUI在表单提交之前进行验证的实例代码
2016/06/24 Javascript
后端接收不到AngularJs中$http.post发送的数据原因分析及解决办法
2016/07/05 Javascript
ECMAScript6轮播图实践知识总结
2016/08/17 Javascript
js实现碰撞检测特效代码分享
2016/10/16 Javascript
bootstrap table动态加载数据示例代码
2017/03/25 Javascript
动态加载、移除js/css文件的示例代码
2018/03/20 Javascript
JS中‘hello’与new String(‘hello’)引出的问题详解
2018/08/14 Javascript
微信小程序实现拖拽功能
2019/09/26 Javascript
javascript递归函数定义和用法示例分析
2020/07/22 Javascript
[05:56]第十六期——新进3大C之小兔基
2014/06/24 DOTA
Python中的复制操作及copy模块中的浅拷贝与深拷贝方法
2016/07/02 Python
Python将DataFrame的某一列作为index的方法
2018/04/08 Python
Python Pandas找到缺失值的位置方法
2018/04/12 Python
flask入门之文件上传与邮件发送示例
2018/07/18 Python
python找出完数的方法
2018/11/12 Python
Python中join()函数多种操作代码实例
2020/01/13 Python
python矩阵运算,转置,逆运算,共轭矩阵实例
2020/05/11 Python
解决python运行启动报错问题
2020/06/01 Python
医院门卫岗位职责
2013/12/30 职场文书
2014年道德讲堂实施方案
2014/03/05 职场文书
行政处罚告知书
2015/07/01 职场文书
2019学校运动会开幕词
2019/05/13 职场文书
六年级作文之家庭作文
2019/12/12 职场文书
MySQL空间数据存储及函数
2021/09/25 MySQL
Win10/Win11 任务栏替换成经典样式
2022/04/19 数码科技