node.js中实现同步操作的3种实现方法


Posted in Javascript onDecember 05, 2014

众所周知,异步是得天独厚的特点和优势,但同时在程序中同步的需求(比如控制程序的执行顺序为: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);  

    } 

  ]

);
Javascript 相关文章推荐
jquery可见性过滤选择器使用示例
Jun 24 Javascript
node.js中的http.response.end方法使用说明
Dec 14 Javascript
JS验证IP,子网掩码,网关和MAC的方法
Jul 02 Javascript
jquery实现鼠标悬浮停止轮播特效
Aug 20 Javascript
JS使用正则表达式过滤多个词语并替换为相同长度星号的方法
Aug 03 Javascript
jQuery 的 ready()的纯js替代方法
Nov 20 Javascript
详解vue.js+UEditor集成 [前后端分离项目]
Jul 07 Javascript
angularjs实现table增加tr的方法
Feb 27 Javascript
详解基于Vue的支持数据双向绑定的select组件
Sep 02 Javascript
微信小程序button标签open-type属性原理解析
Jan 21 Javascript
用JS实现选项卡
Mar 23 Javascript
js实现简单图片拖拽效果
Feb 22 Javascript
node.js实现BigPipe详解
Dec 05 #Javascript
js实现点击添加一个input节点
Dec 05 #Javascript
Node.js实现的简易网页抓取功能示例
Dec 05 #Javascript
浅谈js的setInterval事件
Dec 05 #Javascript
浅谈javascript中createElement事件
Dec 05 #Javascript
javascript的push使用指南
Dec 05 #Javascript
javascript结合ajax读取txt文件内容
Dec 05 #Javascript
You might like
PHP生成excel时单元格内换行问题的解决方法
2010/08/26 PHP
浅析php变量修饰符static的使用
2013/06/28 PHP
PHP动态生成javascript文件的2个例子
2014/04/11 PHP
怎么用javascript进行拖拽
2006/07/20 Javascript
JavaScript 判断判断某个对象是Object还是一个Array
2010/01/28 Javascript
JavaScript中的字符串操作详解
2013/11/12 Javascript
js怎么判断flash swf文件是否加载完毕
2014/08/14 Javascript
js点击列表文字对应该行显示背景颜色的实现代码
2015/08/05 Javascript
BootStrap网页中代码显示用法详解
2016/10/21 Javascript
JavaScript函数基础详解
2017/02/03 Javascript
js, jQuery实现全选、反选功能
2017/03/08 Javascript
使用webpack搭建vue环境的教程详解
2019/12/31 Javascript
Java Web开发过程中登陆模块的验证码的实现方式总结
2016/05/25 Python
Python 正则表达式入门(初级篇)
2016/12/07 Python
Python对多属性的重复数据去重实例
2018/04/18 Python
vue.js实现输入框输入值内容实时响应变化示例
2018/07/07 Python
Python数据集切分实例
2018/12/08 Python
浅谈Python接口对json串的处理方法
2018/12/19 Python
PyCharm导入python项目并配置虚拟环境的教程详解
2019/10/13 Python
python+selenium+Chrome options参数的使用
2020/03/18 Python
快速解决jupyter启动卡死的问题
2020/04/10 Python
Python Request类源码实现方法及原理解析
2020/08/17 Python
Python Merge函数原理及用法解析
2020/09/16 Python
css3 响应式媒体查询的示例代码
2019/09/25 HTML / CSS
HTML5实现视频弹幕功能
2019/08/09 HTML / CSS
DKNY品牌官网:纽约大都会时尚风格
2016/10/20 全球购物
签约仪式策划方案
2014/06/02 职场文书
信息管理与信息系统专业求职信
2014/06/21 职场文书
关于感谢信的范文
2015/01/23 职场文书
全国爱眼日活动总结
2015/02/27 职场文书
2015大学迎新晚会策划书
2015/07/16 职场文书
2015年秋季开学典礼校长致辞
2015/07/16 职场文书
Python爬取英雄联盟MSI直播间弹幕并生成词云图
2021/06/01 Python
Mysql中存储引擎的区别及比较
2021/06/04 MySQL
Redis基本数据类型String常用操作命令
2022/06/01 Redis
Python如何利用pandas读取csv数据并绘图
2022/07/07 Python