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 相关文章推荐
treepanel动态加载数据实现代码
Dec 15 Javascript
javascript实现无限级select联动菜单
Jan 02 Javascript
JQuery使用$.ajax和checkbox实现下次不在通知功能
Apr 16 Javascript
jquery判断单选按钮radio是否选中的方法
May 05 Javascript
Javascript实现的Map集合工具类完整实例
Jul 31 Javascript
基于JavaScript将表单序列化类型的数据转化成对象的处理(允许对象中包含对象)
Dec 28 Javascript
实例讲解使用原生JavaScript处理AJAX请求的方法
May 10 Javascript
JavaScript的String字符串对象常用操作总结
May 26 Javascript
JavaScript实现广告弹窗效果
Aug 09 Javascript
Vue全局分页组件的实现代码
Aug 10 Javascript
解决layui laydate 时间控件一闪而过的问题
Sep 28 Javascript
在vue中使用axios实现post方式获取二进制流下载文件(实例代码)
Dec 16 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 采集获取指定网址的内容
2010/01/05 PHP
php实现监听事件
2013/11/06 PHP
PHPWind9.0手动屏蔽验证码解决后台关闭验证码但是依然显示的问题
2016/08/12 PHP
php array_udiff_assoc 计算两个数组的差集实例
2016/11/12 PHP
使用XHProf查找PHP性能瓶颈的实例
2017/12/13 PHP
PHP读取并输出XML文件数据的简单实现方法
2017/12/22 PHP
点击下载链接 弹出页面实现代码
2009/10/01 Javascript
javascript 从if else 到 switch case 再到抽象
2010/07/17 Javascript
js实现a标签超链接提交form表单的方法
2015/06/24 Javascript
JavaScript 性能优化小结
2015/10/12 Javascript
JavaScript禁止复制与粘贴的实现代码
2016/05/16 Javascript
文本框只能输入数字的实现方法(兼容IE火狐)
2016/06/25 Javascript
jQuery遍历节点树方法分析
2016/09/08 Javascript
JS DOMReady事件的六种实现方法总结
2016/11/23 Javascript
JQuery和HTML5 Canvas实现弹幕效果
2017/01/04 Javascript
如何理解Vue的作用域插槽的实现原理
2017/08/19 Javascript
总结JavaScript在IE9之前版本中内存泄露问题
2018/04/28 Javascript
nodejs中各种加密算法的实现详解
2019/07/11 NodeJs
javascript中的this作用域详解
2019/07/15 Javascript
mpvue实现小程序签到金币掉落动画(api实现)
2019/10/17 Javascript
[02:59]DOTA2完美大师赛主赛事第三日精彩集锦
2017/11/25 DOTA
Python基本数据类型详细介绍
2014/03/11 Python
PYTHON 中使用 GLOBAL引发的一系列问题
2016/10/12 Python
Python文件监听工具pyinotify与watchdog实例
2018/10/15 Python
Python中的random.uniform()函数教程与实例解析
2019/03/02 Python
python tornado修改log输出方式
2019/11/18 Python
python开发一款翻译工具
2020/10/10 Python
python 基于opencv实现图像增强
2020/12/23 Python
香蕉共和国工厂店:Banana Republic Factory
2018/06/09 全球购物
在线实验室测试:HealthLabs.com
2020/05/03 全球购物
致铅球运动员广播稿精选
2014/01/12 职场文书
简历上的自我评价怎么写
2014/01/28 职场文书
教学评估实施方案
2014/03/16 职场文书
长城导游词
2015/01/30 职场文书
求职自我推荐信
2015/03/24 职场文书
2015年机关党建工作总结
2015/05/22 职场文书