众所周知,异步是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);
}
]
);

如何让nodejs同步操作相关推荐

  1. 那些年,在nodejs上踩过的坑

    原文:http://cnodejs.org/topic/4fc7789a8be5d070121141cd ----------------------------------------------- ...

  2. node mysql同步_一些nodejs实现同步操作想法实现

    115同步盘v1.0.9.3 正式版 类型:下载工具大小:1.6M语言:中文 评分:1.8 标签: 立即下载 众所周知,异步是nodejs中得天独厚的特点和优势,但同时在程序中同步的需求(比如控制程序 ...

  3. 七天学会NodeJS

    2019独角兽企业重金招聘Python工程师标准>>> NodeJS基础 什么是NodeJS JS是脚本语言,脚本语言都需要一个解析器才能运行.对于写在HTML页面里的JS,浏览器充 ...

  4. 苏宁Nodejs性能优化实战

    Nodejs 项目背景介绍 \\ 自 2016 年以来,苏宁大规模的使用了基于 Nodejs 渲染的项目,架构使用 Nginx+Nodejs+PM2 组合,其中 Nodejs 版本从最初的 6.0+ ...

  5. nodejs学习资料

    2019独角兽企业重金招聘Python工程师标准>>> NodeJS基础 什么是NodeJS JS是脚本语言,脚本语言都需要一个解析器才能运行.对于写在HTML页面里的JS,浏览器充 ...

  6. js foreach用法_使用 nodejs 写爬虫(一): 常用模块和 js 语法

    本篇是使用 nodejs 写爬虫系列教程的第一篇, 介绍了使用 nodejs 写爬虫过程中常用的模块和一些必须掌握的 js 语法 <!-- more --> 常用模块 常用模块有以下几个: ...

  7. 深入理解nodejs中的异步编程

    文章目录 简介 同步异步和阻塞非阻塞 javascript中的回调 回调函数的错误处理 回调地狱 ES6中的Promise 什么是Promise Promise的特点 Promise的优点 Promi ...

  8. NodeJS同步MySQL上游数据到ElasticSearch数据库中

    NodeJS同步MySQL上游数据到ElasticSearch数据库中 项目地址: https://github.com/Miazzy/xdata-elasticsearchs-service.git ...

  9. Nodejs 内置模块的基本使用

    内置模块的基本使用 // 01. 导包 const fs = require("fs"); // 02. 调用unlink删除方法 // 第一个参数:要删除的文件的路径 // 第二 ...

最新文章

  1. java压缩解压缩类实例[转]
  2. 微软OTech第二次会议(广州站)
  3. 两个时间之间是多少小时_那是两个小时我不会回来
  4. 什么是document对象?如何获取文档对象上的元素?_dom对象
  5. 服务器安装rabbitmq教程
  6. ios 返回指定导航控制器
  7. python定时器的使用方法_Python timer定时器两种常用方法解析
  8. php批量生成优惠券,PHP自动批量生成会员卡号程序
  9. linux系统下虚拟机的安装
  10. FISCO BCOS(十)——— FISCO BCOS的离线安装
  11. 今日你以老师为荣,明日老师以你为荣!
  12. (附源码)flutter+React Native+Springboot Api
  13. 微信小程序代码提交步骤
  14. linux+加载迅雷插件,linux下使用aria2c + chrome插件取代迅雷
  15. 地脚螺钉直径系列_地脚螺栓规格
  16. data fastboot 擦除_fastboot使用教程
  17. 教务管理系统 php源码,优索教务管理系统 v9.3.2
  18. java借助Acrobat实现pdf转word
  19. Unity 3D中实现敌人追踪
  20. 计算机桌面图标不见了6,桌面图标不见了怎么办 如何找回桌面图标【解决方法】...

热门文章

  1. SpringApplication:SpringBoot程序启动的一站式解决方案
  2. 中国官方要求进一步加强中资商业银行境外机构合规管理
  3. Spring第三篇【Core模块之对象依赖】
  4. 《Java设计模式》之桥接模式
  5. Android Studio导入工程的正确姿势
  6. PL/SQL配置文件解析
  7. 余宏德:Sun所有的核心技术都是开放的
  8. android 快传 源码_最新安卓仿茄子快传APP源码包括服务端源码Android开发快传类项目源码全套...
  9. Python3.8安装 jupyter报错 NotImplementedError
  10. Spark应用日志级别设置