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 25 NodeJs
使用nodejs开发cli项目实例
Jun 03 NodeJs
nodejs读写json文件的简单方法(必看)
Mar 09 NodeJs
nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEqual()比较
Sep 18 NodeJs
详解IWinter 一个路由转控制器的 Nodejs 库
Nov 15 NodeJs
nodeJS微信分享
Dec 20 NodeJs
详解nodeJs文件系统(fs)与流(stream)
Jan 24 NodeJs
详解NodeJs开发微信公众号
May 25 NodeJs
NodeJs项目中关闭ESLint的方法
Aug 09 NodeJs
Nodejs把接收图片base64格式保存为文件存储到服务器上
Sep 26 NodeJs
nodejs 使用http进行post或get请求的实例(携带cookie)
Jan 03 NodeJs
通过实例了解Nodejs模块系统及require机制
Jul 16 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
setcookie中Cannot modify header information-headers already sent by错误的解决方法详解
2013/05/08 PHP
深入PHP中的HashTable结构详解
2013/06/13 PHP
php实现图形显示Ip地址的代码及注释
2014/01/20 PHP
PHP jQuery表单,带验证具体实现方法
2014/02/15 PHP
mantis安装、配置和使用中的问题小结
2014/07/14 PHP
PHP使用GETDATE获取当前日期时间作为一个关联数组的方法
2015/03/19 PHP
php正则表达式基本知识与应用详解【经典教程】
2017/04/17 PHP
Javascript实现动态菜单添加的实例代码
2013/07/05 Javascript
JavaScript 数组的深度复制解析
2016/11/02 Javascript
利用jQuery插件imgAreaSelect实现获得选择域的图像信息
2016/12/02 Javascript
VUE axios上传图片到七牛的实例代码
2017/07/28 Javascript
详解实现一个通用的“划词高亮”在线笔记功能
2019/04/23 Javascript
vue实现数据控制视图的原理解析
2020/01/07 Javascript
electron 如何将任意资源打包的方法步骤
2020/04/16 Javascript
vue实现匀速轮播效果
2020/06/29 Javascript
Vue项目中使用mock.js的完整步骤
2021/01/12 Vue.js
[03:37]2015国际邀请赛第四日现场精彩集锦
2015/08/08 DOTA
[01:14]英雄,所敬略同——2018完美盛典宣传视频4K
2018/12/05 DOTA
Python类的定义、继承及类对象使用方法简明教程
2015/05/08 Python
python导入时小括号大作用
2017/01/10 Python
Python绘制3d螺旋曲线图实例代码
2017/12/20 Python
Python异常对代码运行性能的影响实例解析
2018/02/08 Python
django2+uwsgi+nginx上线部署到服务器Ubuntu16.04
2018/06/26 Python
pycharm中使用anaconda部署python环境的方法步骤
2018/12/19 Python
详解pandas库pd.read_excel操作读取excel文件参数整理与实例
2019/02/17 Python
Python的垃圾回收机制详解
2019/08/28 Python
Python实现JS解密并爬取某音漫客网站
2020/10/23 Python
CSS3用@font-face实现自定义英文字体
2013/09/23 HTML / CSS
用HTML5制作一个简单的桌球游戏的教程
2015/05/12 HTML / CSS
水果连锁超市创业计划书
2014/01/24 职场文书
教师产假请假条范文
2014/04/10 职场文书
篮球比赛拉拉队口号
2014/06/10 职场文书
详细的本科生职业生涯规划范文
2014/09/16 职场文书
2019年最新七夕唯美祝福语(60条)
2019/07/22 职场文书
三年级作文之小小梦想
2019/12/06 职场文书
Elasticsearch 基本查询和组合查询
2022/04/19 Python