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 相关文章推荐
safari,opera嵌入iframe页面cookie读取问题解决方法
Jun 23 Javascript
jquery dialog键盘事件代码
Aug 01 Javascript
jQuery表单验证插件formValidator(改进版)
Feb 03 Javascript
jQuery之ajax技术的详细介绍
Jun 19 Javascript
深入剖析JavaScript中的枚举功能
Mar 06 Javascript
JS使用replace()方法和正则表达式进行字符串的搜索与替换实例
Apr 10 Javascript
JS实现在页面随时自定义背景颜色的方法
Feb 27 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单的实现代码
Jun 23 Javascript
IE8利用自带的setCapture和releaseCapture解决iframe的拖拽事件方法
Oct 25 Javascript
JavaScript之Date_动力节点Java学院整理
Jun 28 Javascript
使用vue制作探探滑动堆叠组件的实例代码
Mar 07 Javascript
layui获取多选框中的值方法
Aug 15 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
PHILIPS D1835/D1875的电路分析与打理
2021/03/02 无线电
php缓冲 output_buffering的使用详解
2013/06/13 PHP
PHP简单实现断点续传下载的方法
2015/09/25 PHP
PHP MYSQL简易交互式站点开发
2016/12/27 PHP
PHP的自定义模板引擎
2017/03/24 PHP
PHP设计模式之工厂模式定义与用法详解
2018/04/03 PHP
PHP filesize函数用法浅析
2019/02/15 PHP
浅谈javascript 面向对象编程
2009/10/28 Javascript
jQuery 表格工具集
2010/04/25 Javascript
jquery操作下拉列表、文本框、复选框、单选框集合(收藏)
2014/01/08 Javascript
详解nodejs模板引擎制作
2017/06/14 NodeJs
js canvas实现简单的图像扩散效果
2020/06/28 Javascript
JavaScript如何获取到导航条中HTTP信息
2017/10/10 Javascript
Vue导出json数据到Excel电子表格的示例
2017/12/04 Javascript
JS基于设计模式中的单例模式(Singleton)实现封装对数据增删改查功能
2018/02/06 Javascript
vue2.0+vuex+localStorage代办事项应用实现详解
2018/05/31 Javascript
微信小程序实现星级评分和展示
2018/07/05 Javascript
利用JavaScript缓存远程窃取Wi-Fi密码的思路详解
2018/11/05 Javascript
Layui tree 下拉菜单树的实例代码
2019/09/21 Javascript
electron踩坑之dialog中的callback解决
2020/10/06 Javascript
[02:08]DOTA2英雄基础教程 马格纳斯
2014/01/17 DOTA
[03:56]显微镜下的DOTA2第十一期——鬼畜的死亡先知播音员
2014/06/23 DOTA
python 读取文件并把矩阵转成numpy的两种方法
2019/02/12 Python
Python数据可视化:泊松分布详解
2019/12/07 Python
pytorch常见的Tensor类型详解
2020/01/15 Python
python 爬虫 实现增量去重和定时爬取实例
2020/02/28 Python
pycharm最新激活码有效期至2100年(亲测可用)
2021/02/05 Python
亚马逊墨西哥站:Amazon.com.mx
2018/08/26 全球购物
Talbots官网:美国成熟女装品牌
2019/11/15 全球购物
越南母婴用品购物网站:Kids Plaza
2020/04/09 全球购物
高级文秘工作总结的自我评价
2013/09/28 职场文书
三年级评语大全
2014/04/23 职场文书
临时用工协议书范本
2014/10/29 职场文书
2014年学生会个人工作总结
2014/11/07 职场文书
党支部书记岗位职责
2015/02/15 职场文书
mysql如何能有效防止删库跑路
2021/10/05 MySQL