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中SSL服务的性能
Jul 15 NodeJs
NodeJS学习笔记之(Url,QueryString,Path)模块
Jan 13 NodeJs
NodeJS与HTML5相结合实现拖拽多个文件上传到服务器的实现方法
Jul 26 NodeJs
Nodejs中解决cluster模块的多进程如何共享数据问题
Nov 10 NodeJs
NodeJS学习笔记之Module的简介
Mar 24 NodeJs
NodeJs使用Mysql模块实现事务处理实例
May 31 NodeJs
NodeJs通过async/await处理异步的方法
Oct 09 NodeJs
nodejs+mongodb aggregate级联查询操作示例
Mar 17 NodeJs
nodejs微信开发之授权登录+获取用户信息
Mar 17 NodeJs
NodeJs实现简易WEB上传下载服务器
Aug 10 NodeJs
nodejs如何在package.json中设置多条启动命令
Mar 16 NodeJs
nodejs处理tcp连接的核心流程
Feb 26 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 文章中的远程图片采集到本地的代码
2009/07/30 PHP
php通过COM类调用组件的实现代码
2012/01/11 PHP
PHP fopen 读取带中文URL地址的一点见解
2012/09/25 PHP
解析在apache里面给php写虚拟目录的详细方法
2013/06/24 PHP
老生常谈PHP位运算的用途
2017/03/12 PHP
laravel实现按时间日期进行分组统计方法示例
2019/03/23 PHP
获取任意Html元素与body之间的偏移距离 offsetTop、offsetLeft (For:IE5+ FF1 )[
2006/12/22 Javascript
Javascript实现的分页函数
2007/02/07 Javascript
改版了网上的一个js操作userdata
2007/04/27 Javascript
常用简易JavaScript函数
2009/04/09 Javascript
学习ExtJS Column布局
2009/10/08 Javascript
JavaScript实用技巧(一)
2010/08/16 Javascript
基于jquery的时间段实现代码
2012/08/02 Javascript
一些实用性较高的js方法
2016/04/19 Javascript
jQuery Ajax Post 回调函数不执行问题的解决方法
2016/08/15 Javascript
Bootstrap源码学习笔记之bootstrap进度条
2016/12/24 Javascript
JS HTML图片显示Canvas 压缩功能
2017/07/21 Javascript
vue+iview写个弹框的示例代码
2017/12/05 Javascript
vue.js 添加 fastclick的支持方法
2018/08/28 Javascript
vue实现微信分享链接添加动态参数的方法
2019/04/29 Javascript
基于vue写一个全局Message组件的实现
2019/08/15 Javascript
原生jQuery实现只显示年份下拉框
2020/12/24 jQuery
[02:38]DOTA2英雄基础教程 噬魂鬼
2014/01/03 DOTA
详细介绍Python函数中的默认参数
2015/03/30 Python
Python字典操作详细介绍及字典内建方法分享
2018/01/04 Python
用纯css3实现的图片放大镜特效效果非常不错
2014/09/02 HTML / CSS
Desigual德国官网:在线购买原创服装
2018/03/27 全球购物
可打印的优惠券、杂货和优惠券代码:Coupons.com
2018/06/12 全球购物
美国轮胎网站:Priority Tire
2018/11/28 全球购物
SQL Server笔试题
2012/01/10 面试题
C#笔试题
2015/07/14 面试题
护理专科毕业自荐信范文
2014/04/21 职场文书
2015初中生物教研组工作总结
2015/07/21 职场文书
德能勤绩工作总结
2015/08/11 职场文书
SpringBoot整合Minio文件存储
2022/04/03 Java/Android
WIN10使用IIS部署ftp服务器详细教程
2022/08/05 Servers