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动态加载javascript以减少服务器压力
Oct 29 Javascript
JavaScript 实现简单的倒计时弹窗DEMO附图
Mar 05 Javascript
js实现编辑div节点名称的方法
Dec 17 Javascript
Javascript中的几种URL编码方法比较
Jan 23 Javascript
jQuery实现漂亮实用的商品图片tips提示框效果(无图片箭头+阴影)
Apr 16 Javascript
Javascript中apply、call、bind的巧妙使用
Aug 18 Javascript
js中apply与call简单用法详解
Nov 06 Javascript
vue 项目常用加载器及配置详解
Jan 22 Javascript
layer.open 按钮的点击事件关闭方法
Aug 17 Javascript
JavaScript惰性求值的一种实现方法示例
Jan 11 Javascript
Angular PWA使用的Demo示例
Jan 31 Javascript
javascript中contains是否包含功能实现代码(扩展字符、数组、dom)
Apr 07 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
mysql4.1以上版本连接时出现Client does not support authentication protocol问题解决办法
2007/03/15 PHP
php绘制一个扇形的方法
2015/01/24 PHP
Javascript下的keyCode键码值表
2007/04/10 Javascript
Javascript 继承机制的实现
2009/08/12 Javascript
js 返回时间戳所对应的具体时间
2010/07/20 Javascript
基于Jquery的表格隔行换色,移动换色,点击换色插件
2010/12/22 Javascript
JSON 数据格式介绍
2012/01/13 Javascript
raphael.js绘制中国地图 地图绘制方法
2014/02/12 Javascript
javascript相关事件的几个概念
2015/05/21 Javascript
jQuery实现简单下拉导航效果
2015/09/07 Javascript
jquery删除table当前行的实例代码
2016/10/07 Javascript
JavaScript基于扩展String实现替换字符串中index处字符的方法
2017/06/13 Javascript
BootStrap给table表格的每一行添加一个按钮事件
2017/09/07 Javascript
vue中子组件向父组件传递数据的实例代码(实现加减功能)
2018/04/20 Javascript
更改BootStrap popover的默认样式及popover简单用法
2018/09/13 Javascript
Angular如何由模板生成DOM树的方法
2019/12/23 Javascript
vuecli3.x中轻松4步带你使用tinymce的步骤
2020/06/25 Javascript
VUE : vue-cli中去掉路由中的井号#操作
2020/09/04 Javascript
js实现弹窗猜数字游戏
2020/11/26 Javascript
[04:14]从西雅图到上海——玩家自制DOTA2主题歌曲应援TI9
2019/07/11 DOTA
K-近邻算法的python实现代码分享
2017/12/09 Python
Python简单实现网页内容抓取功能示例
2018/06/07 Python
python实现从文件中读取数据并绘制成 x y 轴图形的方法
2018/10/14 Python
python selenium 查找隐藏元素 自动播放视频功能
2019/07/24 Python
python实现视频读取和转化图片
2019/12/10 Python
jupyter修改文件名方式(TensorFlow)
2020/04/21 Python
Myprotein瑞典官方网站:畅销欧洲英国运动营养品牌
2018/01/22 全球购物
打架检讨书500字
2014/01/29 职场文书
文秘人员工作职责
2014/01/31 职场文书
记帐员岗位责任制
2014/02/08 职场文书
企业领导班子四风对照检查材料
2014/09/27 职场文书
pytorch Dropout过拟合的操作
2021/05/27 Python
【海涛DOTA解说】EVE女子战队独家录像加ZSMJ神牛两连发
2022/04/01 DOTA
《吸血鬼幸存者》新内容发布 追加多个全新模式
2022/04/07 其他游戏
使用Mysql计算地址的经纬度距离和实时位置信息
2022/04/29 MySQL
windows server2008 开启端口的实现方法
2022/06/25 Servers