如何让nodejs同步操作

众所周知,异步是nodejs中得天独厚的特点和优势,但同时在程序中同步的需求(比如控制程序的执行顺序为:func1 -> func2 ->func3 )也是很常见的。本文就是对这个问题记录自己的一些想法。

需要执行的函数:

 
var func1 = function(req,res,callback){
setTimeout(function(){
console.log('in func1');
callback(req,res,1);  
},13000);
}
var func2 = function(req,res,callback){ 
setTimeout(function(){
console.log('in func2');
callback(req,res,2);
},5000);
}
var func3 = function(req,res,callback){
setTimeout(function(){
console.log('in func3');
callback(req,res,3);   
},1000);
}
 

可以看出在func1,func2和func3中都是用了setTimeout函数,执行的时间分别为13秒,5秒和1秒。由于nodejs异步的特性,如果使用普通的函数调用方法:

 
var req = null;
var res = null;
var callback = function(){};
func1(req,res,callback);
func2(req,res,callback);
func3(req,res,callback);
 

输出内容:

in func3
in func2
in func1

原因是因为nodejs是异步的,func2不会等func1执行完毕后再执行,而是立即执行(func3也是如此)。由于func3的运行时间最短而率先结束,func2次之,func1最后。但这明显不是我们想要的结果。怎么办?

解决办法一:callback

 
//深层嵌套
var req = null;
var res = null;
func1(req,res,function(){
func2(req,res,function(){
func3(req,res,function(){
process.exit(0);   
})  
});  
});
 

这种方法虽然能快速的解决,但暴露的问题也很明显,一是代码维护不方面,二是代码的深层嵌套看起来很不舒服。这种方法并不可取。

 

解决方法二:递归调用

 
function executeFunc(funcs,count,sum,req,res){
if(count == sum){
return ; 
}
else{
funcs[count](req,req,function(){
count++;
executeFunc(funcs,count,sum,req,res);
});
}  
}
//同步调用
var req = null;
var res = null;
var funcs = [func1,func2,func3];
var len = funcs.length;
executeFunc(funcs,0,len,req,res);
 

先将多个函数组成一个数组。再可以利用递归函数的特性,使程序按照一定的顺序执行。

 

解决方法三:调用类库

随着nodejs的发展,响应的类库也越来越多。Step和async 就是其中不错的。

1. Step的调用相对比较清爽:

 
Step(
function thefunc1(){
func1(this);
},
function thefunc2(finishFlag){
console.log(finishFlag);
func2(this);
},
function thefunc3(finishFlag){
console.log(finishFlag);
}
);
 

2.async 的 series方法,就本例而言,它的调用方法:

 
var req = null;
var res = null;
var callback = function(){};
async.series(
[
function(callback){
func1(req,res,callback);
},  
function(callback){
func2(req,res,callback);
},
function(callback){
func3(req,res,callback);  
} 
]
);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/547353.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mediapipe框架学习之一——Win10安装Mediapipe环境

Mediapipe官方文档 Mediapipe框架学习之一——Win10安装Mediapipe环境 Mediapipe框架学习之二——Android SDK and NDK 配置 Mediapipe框架学习之三——构建 MediaPipe 的 Android aar 包 Mediapipe框架学习之四——利用 Mediapipe aar 包,在AS中构建基于 Media…

MemCache在win7上的可视化配置以及Nodejs/Net应用

惯例科普:MemCache是一套分布式的高速缓存系统,由LiveJournal的Brad Fitzpatrick开发,但目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的、需要频繁访问数据库的网站访问速度提升效果十分显著。这是一套开放源代码软件…

Android AM命令行启动程序的方法

http://blog.csdn.net/sunrock/article/details/5675067 在前面添加一句 启动服务的话 使用 am startservice com.lxb.window/.RecordService即可在Android中,除了从界面上启动程序之外,还可以从命令行启动程序,使用的是命令行工具am.usage: …

Apache httpd 配置HTTPS SSL访问 443

2, 首先安装https模块yum install mod_ssl 3. 配置Apache Web服务器 首先,修改下面的配置文件。仅需配置红色部分 SSLCertificateFile 和 SSLCertificateKeyFile # vim /etc/httpd/conf.d/ssl.conf # # When we also provide SSL we have to listen to the # t…

Redis在win7上的可视化应用

Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并…

全网最详细的docker配置nginx http2 优化高速访问

Nginx 从 1.13.9 版本开始加入了 HTTP/2 的 Server Push 功能,本文将介绍如何在 Nginx 下实现 HTTP/2 服务器推送 (Server Push) 。这里我们首先用 Docker 搭建一个支持 HTTP/2 的 Server Push 功能的 Nginx 容器并加入 SSL 证书。如果你还不会 Docker,可…

Flex Graphics

<?xml version"1.0" encoding"utf-8"?> <s:Application xmlns:fx"http://ns.adobe.com/mxml/2009" xmlns:s"library://ns.adobe.com/flex/spark" xmlns:mx"library://ns.adobe.com/flex/halo"minWidth"1024…

CentOS安装运行NodeJS框架Express

安装依赖包 yum -y install gcc make gcc-c openssl-devel wget 下载/解压NodeJs wget http://nodejs.org/dist/v0.12.7/node-v0.12.7.tar.gztar -zvxf node-v0.12.7.tar.gz 编译及安装&#xff0c;逐行执行 cd node-v0.12.7./configuremake install 验证是否安装配置成功&…

android点滴27:R文件无法加载 R cannot be resolved to a v...

2019独角兽企业重金招聘Python工程师标准>>> 导致这个问题原因可能有二个&#xff1a;1. manifest文件中的包名和真正的报名不统一 2. 在java文件中导入了R文件&#xff0c;在java文件中无需导入任何包的R文件&#xff0c;系统会自动加载gen目录下的R文件。 转载于…

MITK医学Python开发入门详细版

1.关于MITK&#xff1a; MITK的全称是”The Medical Imaging Interaction Toolkit”。它是一款开源的交互式医学图像处理软件开发和应用平台。MITK将ITK和VTK整合为一个应用框架。该软件由德国一个研究室开发。官网地址为&#xff1a;http://mitk.org/wiki/MITK 。 与MITK同名…

ubuntu配置×××后,配置走×××的路线

先执行route命令查看所有的路由route看到的结果大致如下内核 IP 路由表 目标 网关 子网掩码 标志 跃点 引用 使用 接口 default 192.168.8.1 0.0.0.0 UG 0 0 0 wlan0 110.185.76.107 192.168.8.1 25…

Python SimpleITK实现医学图像增强算法

1、对数变换 图像对数变换首先将图像从SimpleITK图像数据转成Numpy矩阵数据&#xff0c;然后采用Numpy的log1p&#xff08;&#xff09;函数来计算数据的log&#xff08;1x&#xff09;变换&#xff0c;由于1x不能小于零&#xff0c;因此这里我们使用图像减去图像的最小值来计…

中国计算机学会通讯杂志,何积丰. Cyber-physical systems [J]. 中国计算机学会通讯, 2010, 6(1): 25-29....

摘要:本文提出了将计算机和互联网技术引入传统的基于模拟电路和微控制器的电池管理系统的想法&#xff0c;以此为电池系统带来更高的安全性和更长的寿命&#xff0c;降低电池端硬件的复杂度和成本。本文讨论了电池管理系统的详细设计和实现过程。系统通过MATLAB仿真工具Simulin…

使用Nginx配置NodeJs程序(Windows平台)

简介 Nginx("engine x") 是一个高性能的 HTTP 和 反向代理 服务器&#xff0c;也是一个 IMAP/POP3/SMTP 服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的&#xff0c;第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证…

Hadoop Mapreduce分区、分组、二次排序过程详解[转]

徐海蛟 教学用途1、MapReduce中数据流动&#xff08;1&#xff09;最简单的过程&#xff1a; map - reduce&#xff08;2&#xff09;定制了partitioner以将map的结果送往指定reducer的过程&#xff1a; map - partition - reduce&#xff08;3&#xff09;增加了在本地先进性…

服务器系统上1068错误,错误1068,详细教您启动网络服务错误1068怎么解决

在电脑中&#xff0c;通常开机后就会自动连接网络宽带&#xff0c;不过有用户遇到问题。开机后网络图标显示红叉或者图标正常无法上网&#xff0c;打开网络和共享中心才发现是服务或者组无法启动&#xff0c;启动时显示错误1068&#xff0c;这该怎么办&#xff1f;下面&#xf…

NodeJs连接Oracle数据库

nodejs连接oracle数据库&#xff0c;各个平台的官方详情文档&#xff1a;https://github.com/oracle/node-oracledb/blob/master/INSTALL.md 我的nodejs连接Oracle的配置&#xff0c;运行环境: windows7 x64 nodejs 0.12.7 Python 2.7.10 npm 2.11.3 运行原理分析 npm调…

重置Oracle密码

在系统运行中输入&#xff1a; sqlplus /nolog 在命令窗口分别执行&#xff1a; conn /as sysdbaalter user scott identified by tiger;alter user scott account unlock; 这样就把“scott”用户密码修改为“tiger”了&#xff0c;用户可根据自己需求&#xff0c;重置密码。

ImportError: No module named ‘sklearn.qda‘  ImportError: No module named ‘sklearn.lda‘

ImportError: No module named sklearn.qda ImportError: No module named sklearn.lda from sklearn.qda import QDAImportError: No module named sklearn.qda’ from sklearn.qda import LDAImportError: No module named sklearn.lda’ 版本更新问题。 更改为&#…

maven实现多模块热部署

2019独角兽企业重金招聘Python工程师标准>>> 一、背景 基于maven的项目工程都会按模块划分&#xff0c;每个模块最终形成一个jar包&#xff0c;那么每次对模块的修改就需要重新打包&#xff0c;这样的工作重复而繁琐&#xff0c;以前的热部署解决方案都是只针对web…