如何让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); } ] );
如何让nodejs同步操作相关推荐
- 那些年,在nodejs上踩过的坑
原文:http://cnodejs.org/topic/4fc7789a8be5d070121141cd ----------------------------------------------- ...
- node mysql同步_一些nodejs实现同步操作想法实现
115同步盘v1.0.9.3 正式版 类型:下载工具大小:1.6M语言:中文 评分:1.8 标签: 立即下载 众所周知,异步是nodejs中得天独厚的特点和优势,但同时在程序中同步的需求(比如控制程序 ...
- 七天学会NodeJS
2019独角兽企业重金招聘Python工程师标准>>> NodeJS基础 什么是NodeJS JS是脚本语言,脚本语言都需要一个解析器才能运行.对于写在HTML页面里的JS,浏览器充 ...
- 苏宁Nodejs性能优化实战
Nodejs 项目背景介绍 \\ 自 2016 年以来,苏宁大规模的使用了基于 Nodejs 渲染的项目,架构使用 Nginx+Nodejs+PM2 组合,其中 Nodejs 版本从最初的 6.0+ ...
- nodejs学习资料
2019独角兽企业重金招聘Python工程师标准>>> NodeJS基础 什么是NodeJS JS是脚本语言,脚本语言都需要一个解析器才能运行.对于写在HTML页面里的JS,浏览器充 ...
- js foreach用法_使用 nodejs 写爬虫(一): 常用模块和 js 语法
本篇是使用 nodejs 写爬虫系列教程的第一篇, 介绍了使用 nodejs 写爬虫过程中常用的模块和一些必须掌握的 js 语法 <!-- more --> 常用模块 常用模块有以下几个: ...
- 深入理解nodejs中的异步编程
文章目录 简介 同步异步和阻塞非阻塞 javascript中的回调 回调函数的错误处理 回调地狱 ES6中的Promise 什么是Promise Promise的特点 Promise的优点 Promi ...
- NodeJS同步MySQL上游数据到ElasticSearch数据库中
NodeJS同步MySQL上游数据到ElasticSearch数据库中 项目地址: https://github.com/Miazzy/xdata-elasticsearchs-service.git ...
- Nodejs 内置模块的基本使用
内置模块的基本使用 // 01. 导包 const fs = require("fs"); // 02. 调用unlink删除方法 // 第一个参数:要删除的文件的路径 // 第二 ...
最新文章
- java压缩解压缩类实例[转]
- 微软OTech第二次会议(广州站)
- 两个时间之间是多少小时_那是两个小时我不会回来
- 什么是document对象?如何获取文档对象上的元素?_dom对象
- 服务器安装rabbitmq教程
- ios 返回指定导航控制器
- python定时器的使用方法_Python timer定时器两种常用方法解析
- php批量生成优惠券,PHP自动批量生成会员卡号程序
- linux系统下虚拟机的安装
- FISCO BCOS(十)——— FISCO BCOS的离线安装
- 今日你以老师为荣,明日老师以你为荣!
- (附源码)flutter+React Native+Springboot Api
- 微信小程序代码提交步骤
- linux+加载迅雷插件,linux下使用aria2c + chrome插件取代迅雷
- 地脚螺钉直径系列_地脚螺栓规格
- data fastboot 擦除_fastboot使用教程
- 教务管理系统 php源码,优索教务管理系统 v9.3.2
- java借助Acrobat实现pdf转word
- Unity 3D中实现敌人追踪
- 计算机桌面图标不见了6,桌面图标不见了怎么办 如何找回桌面图标【解决方法】...
热门文章
- SpringApplication:SpringBoot程序启动的一站式解决方案
- 中国官方要求进一步加强中资商业银行境外机构合规管理
- Spring第三篇【Core模块之对象依赖】
- 《Java设计模式》之桥接模式
- Android Studio导入工程的正确姿势
- PL/SQL配置文件解析
- 余宏德:Sun所有的核心技术都是开放的
- android 快传 源码_最新安卓仿茄子快传APP源码包括服务端源码Android开发快传类项目源码全套...
- Python3.8安装 jupyter报错 NotImplementedError
- Spark应用日志级别设置