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 相关文章推荐
javascript中使用css需要注意的地方小结
Sep 01 Javascript
jquery zTree异步加载简单实例分享
Feb 05 Javascript
JavaScript获取URL汇总
Jun 08 Javascript
AngularJS API之copy深拷贝详解及实例
Sep 14 Javascript
jQuery实现的点击标题文字切换字体效果示例【测试可用】
Apr 26 jQuery
深入理解Vue nextTick 机制
Apr 28 Javascript
一步快速解决微信小程序中textarea层级太高遮挡其他组件
Mar 04 Javascript
详解Node.js一行命令上传本地文件到服务器
Apr 22 Javascript
使用异步controller与jQuery实现卷帘式分页
Jun 18 jQuery
JQuery复选框全选效果如何实现
May 08 jQuery
Python版实现微信公众号扫码登陆
May 28 Javascript
36个正则表达式(开发效率提高80%)
Nov 17 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 获得汉字拼音首字母的函数
2009/08/01 PHP
PHP实现图片自动清理的方法
2015/07/08 PHP
LAMP环境使用Composer安装Laravel的方法
2017/03/25 PHP
PHP读取目录树的实现方法分析
2019/03/22 PHP
jQuery动态添加、删除元素的方法
2014/01/09 Javascript
JavaScript截取字符串的2个函数介绍
2014/08/27 Javascript
node.js中的fs.chown方法使用说明
2014/12/16 Javascript
js实现格式化金额,字符,时间的方法
2015/02/26 Javascript
javascript处理a标签超链接默认事件的方法
2015/06/29 Javascript
jQuery EasyUI 布局之动态添加tabs标签页
2015/11/18 Javascript
JS中Eval解析JSON字符串的一个小问题
2016/02/21 Javascript
分享12个非常实用的JavaScript小技巧
2016/05/11 Javascript
jquery.onoff实现简单的开关按钮功能(推荐)
2018/05/24 jQuery
深入理解 JS 垃圾回收
2019/06/03 Javascript
Vue替代marquee标签超出宽度文字横向滚动效果
2019/12/09 Javascript
nodejs如何在package.json中设置多条启动命令
2020/03/16 NodeJs
JS正则表达式验证密码强度
2020/03/18 Javascript
C#返回当前系统所有可用驱动器符号的方法
2015/04/18 Python
在Python的Django框架中编写错误提示页面
2015/07/22 Python
对比Python中__getattr__和 __getattribute__获取属性的用法
2016/06/21 Python
Pandas标记删除重复记录的方法
2018/04/08 Python
Django 路由控制的实现代码
2018/11/08 Python
解决pycharm运行出错,代码正确结果不显示的问题
2018/11/30 Python
在python中做正态性检验示例
2019/12/09 Python
python nohup 实现远程运行不宕机操作
2020/04/16 Python
python中封包建立过程实例
2021/02/18 Python
发现世界上最好的珠宝设计师:JewelStreet
2017/12/17 全球购物
求职信怎么写范文
2014/05/26 职场文书
提拔干部考察材料
2014/05/26 职场文书
2014医学院领导班子对照检查材料思想汇报
2014/09/19 职场文书
成本会计实训报告
2014/11/05 职场文书
农业项目合作意向书
2015/05/08 职场文书
运动会100米广播稿
2015/08/19 职场文书
python 如何获取页面所有a标签下href的值
2021/05/06 Python
正确使用MySQL update语句
2021/05/26 MySQL
python必学知识之文件操作(建议收藏)
2021/05/30 Python