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实现的一个简单udp广播服务器、客户端
Sep 25 NodeJs
轻松创建nodejs服务器(8):非阻塞是如何实现的
Dec 18 NodeJs
NodeJS学习笔记之(Url,QueryString,Path)模块
Jan 13 NodeJs
windows下安装nodejs及框架express
Aug 07 NodeJs
基于html5和nodejs相结合实现websocket即使通讯
Nov 19 NodeJs
NodeJs——入门必看攻略
Jun 27 NodeJs
nodejs进阶(6)—连接MySQL数据库示例
Jan 07 NodeJs
Nodejs高扩展性的模板引擎 functmpl简介
Feb 13 NodeJs
NodeJS安装图文教程
Apr 19 NodeJs
nodeJS模块简单用法示例
Apr 21 NodeJs
基于Nodejs的Tcp封包和解包的理解
Sep 19 NodeJs
Nodejs实现多文件夹文件同步
Oct 17 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中ob_flush和flush的区别
2014/11/27 PHP
THinkPHP获取客户端IP与IP地址查询的方法
2016/11/14 PHP
详谈配置phpstorm完美支持Codeigniter(CI)代码自动完成(代码提示)
2017/04/07 PHP
jQuery Div中加载其他页面的实现代码
2009/02/27 Javascript
一个通过script自定义属性传递配置参数的方法
2014/09/15 Javascript
jQuery中not()方法用法实例
2015/01/06 Javascript
JS+CSS实现Div弹出窗口同时背景变暗的方法
2015/03/04 Javascript
express文件上传中间件Multer详解
2016/10/24 Javascript
Bootstrap table学习笔记(2) 前后端分页模糊查询
2017/05/18 Javascript
关于Ajax的原理以及代码封装详解
2017/09/08 Javascript
Vue 获取数组键名的方法
2018/06/21 Javascript
taro开发微信小程序的实践
2019/05/21 Javascript
layui table 获取分页 limit的方法
2019/09/20 Javascript
JS+css3实现幻灯片轮播图
2020/08/14 Javascript
解决vue加scoped后就无法修改vant的UI组件的样式问题
2020/09/07 Javascript
Python爬取三国演义的实现方法
2016/09/12 Python
python 生成图形验证码的方法示例
2018/11/11 Python
python实现ip代理池功能示例
2019/07/05 Python
Python 处理文件的几种方式
2019/08/23 Python
Scrapy框架基本命令与settings.py设置
2020/02/06 Python
Django实现随机图形验证码的示例
2020/10/15 Python
Ubuntu20.04环境安装tensorflow2的方法步骤
2021/01/29 Python
HTML5组件Canvas实现图像灰度化(步骤+实例效果)
2013/04/22 HTML / CSS
护士的自我鉴定
2014/02/07 职场文书
韩语专业职业生涯规划范文:成功之路就在我们脚下
2014/09/11 职场文书
夫妻婚内购房协议书
2014/10/05 职场文书
护理实习生带教计划
2015/01/16 职场文书
离职感谢信怎么写
2015/01/22 职场文书
行政主管岗位职责
2015/02/03 职场文书
祝酒词范文
2015/08/12 职场文书
竞选稿之小学班干部
2019/10/31 职场文书
简单实现一个手持弹幕功能+文字抖动特效
2021/03/31 HTML / CSS
最新最全的手机号验证正则表达式
2022/02/24 Javascript
SpringBoot+Redis实现布隆过滤器的示例代码
2022/03/17 Java/Android
Pytorch中使用ImageFolder读取数据集时忽略特定文件
2022/03/23 Python
Docker与K8s关系介绍不会Docker也可以使用K8s
2022/06/25 Servers