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爬虫遇到的乱码问题汇总
Apr 07 NodeJs
nodejs个人博客开发第五步 分配数据
Apr 12 NodeJs
配置nodejs环境的方法
May 13 NodeJs
详解使用nodeJs安装Vue-cli
May 17 NodeJs
nodejs利用ajax实现网页无刷新上传图片实例代码
Jun 06 NodeJs
使用nodeJs来安装less及编译less文件为css文件的方法
Nov 20 NodeJs
nodejs实现简单的gulp打包
Dec 21 NodeJs
nodejs实现的简单web服务器功能示例
Mar 15 NodeJs
nodejs二进制与Buffer的介绍与使用
Jul 11 NodeJs
nodejs读取图片返回给浏览器显示
Jul 25 NodeJs
纯异步nodejs文件夹(目录)复制功能
Sep 03 NodeJs
nodejs环境使用Typeorm连接查询Oracle数据
Dec 05 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
全国FM电台频率大全 - 31 新疆维吾尔族自治区
2020/03/11 无线电
ajax php 实现写入数据库
2009/09/02 PHP
php中get_meta_tags()、CURL与user-agent用法分析
2014/12/16 PHP
PHP四种基本排序算法示例
2015/04/09 PHP
通过PHP简单实例介绍文件上传
2015/12/16 PHP
PHP5.6.8连接SQL Server 2008 R2数据库常用技巧分析总结
2019/05/06 PHP
jQuery Select(单选) 模拟插件 V1.3.62 改进版
2010/07/17 Javascript
$(document).ready(function() {})不执行初始化脚本
2014/06/19 Javascript
jquery用data方法获取某个元素上的事件
2014/06/23 Javascript
简单实现兼容各大浏览器的js复制内容到剪切板
2015/09/09 Javascript
JavaScript SHA512加密算法详细代码
2016/10/06 Javascript
浅谈AngularJs指令之scope属性详解
2016/10/24 Javascript
js实现HashTable(哈希表)的实例分析
2016/11/21 Javascript
微信小程序-详解数据缓存
2016/11/24 Javascript
vue2.0 实现导航守卫的具体用法(路由守卫)
2018/05/17 Javascript
vue+axios实现文件下载及vue中使用axios的实例
2018/09/21 Javascript
Node.js之删除文件夹(含递归删除)代码实例
2019/09/09 Javascript
基于JS实现简单滑块拼图游戏
2019/10/12 Javascript
合并Excel工作薄中成绩表的VBA代码,非常适合教育一线的朋友
2009/04/09 Python
布同 Python中文问题解决方法(总结了多位前人经验,初学者必看)
2011/03/13 Python
Python装饰器用法实例总结
2018/05/26 Python
python 提取key 为中文的json 串方法
2018/12/31 Python
基于wxPython的GUI实现输入对话框(1)
2019/02/27 Python
Django REST framework 单元测试实例解析
2019/11/07 Python
最小二乘法及其python实现详解
2020/02/24 Python
Python执行时间的几种计算方法
2020/07/31 Python
shell变量的作用空间是什么
2013/08/17 面试题
个人求职简历中英文自我评价
2013/12/16 职场文书
鸿星尔克广告词
2014/03/21 职场文书
学校花圃的标语
2014/06/18 职场文书
立春观后感
2015/06/18 职场文书
导游词之杭州岳王庙
2019/11/13 职场文书
python基础之模块的导入
2021/10/24 Python
实操Python爬取觅知网素材图片示例
2021/11/27 Python
中国十大神话动漫电影排行榜 哪吒登顶 白蛇缘起排第七
2022/03/21 国漫
配置nginx负载均衡
2022/05/06 Servers