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 相关文章推荐
prototype 1.5相关知识及他人笔记
Dec 16 Javascript
Extjs学习过程中新手容易碰到的低级错误积累
Feb 11 Javascript
JS验证邮箱格式是否正确的代码
Dec 05 Javascript
浅谈window对象的scrollBy()方法
Jul 15 Javascript
Javascript获取background属性中url的值
Oct 17 Javascript
JavaScript中闭包的详解
Apr 01 Javascript
jQuery选取所有复选框被选中的值并用Ajax异步提交数据的实例
Aug 04 jQuery
mockjs,json-server一起搭建前端通用的数据模拟框架教程
Dec 18 Javascript
JavaScript基于遍历操作实现对象深拷贝功能示例
Mar 05 Javascript
Vue使用NProgress进度条的方法
Sep 21 Javascript
详解搭建一个vue-cli的移动端H5开发模板
Jan 17 Javascript
vue v-for出来的列表,点击某个li使得当前被点击的li字体变红操作
Jul 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相当简单的分页类
2008/10/02 PHP
php 伪造ip以及url来路信息方法汇总
2014/11/25 PHP
PHP实现获取客户端IP并获取IP信息
2015/03/17 PHP
return false,对阻止事件默认动作的一些测试代码
2010/11/17 Javascript
jQuery使用andSelf()来包含之前的选择集
2014/05/19 Javascript
基于jQuery实现表单提交验证
2014/11/24 Javascript
jQuery学习笔记之创建DOM元素
2015/01/19 Javascript
关于网页中的无缝滚动的js代码
2016/06/09 Javascript
Bootstrap 3.x打印预览背景色与文字显示异常的解决
2016/11/06 Javascript
详解vue-validator(vue验证器)
2017/01/16 Javascript
JavaScript实现定时页面跳转功能示例
2017/02/14 Javascript
JavaScript对象引用与赋值实例详解
2017/03/15 Javascript
微信小程序与后台PHP交互的方法实例分析
2018/12/10 Javascript
Node.js 的 GC 机制详解
2019/06/03 Javascript
vue-router结合vuex实现用户权限控制功能
2019/11/14 Javascript
微信小程序的引导页实现代码
2020/06/24 Javascript
JavaScript中如何调用Java方法
2020/09/16 Javascript
[01:03:38]2014 DOTA2国际邀请赛中国区预选赛5.21 CNB VS CIS
2014/05/22 DOTA
python启动办公软件进程(word、excel、ppt、以及wps的et、wps、wpp)
2009/04/09 Python
python3用PIL把图片转换为RGB图片的实例
2019/07/04 Python
PyQt5中QTableWidget如何弹出菜单的示例代码
2020/02/23 Python
Python猴子补丁Monkey Patch用法实例解析
2020/03/23 Python
Numpy中np.random.rand()和np.random.randn() 用法和区别详解
2020/10/23 Python
浅析两列自适应布局的3种思路
2016/05/03 HTML / CSS
CSS3制作苹果风格键盘特效
2015/02/26 HTML / CSS
HTML5 window/iframe跨域传递消息 API介绍
2013/08/26 HTML / CSS
美国诺德斯特龙百货官网:Nordstrom
2016/08/23 全球购物
英国家庭、花园、汽车和移动解决方案:Easylife Group
2018/05/23 全球购物
前台文员职责范本
2014/03/07 职场文书
任命书格式
2014/06/05 职场文书
大学本科生职业生涯规划书范文
2014/09/14 职场文书
有关浪费资源的建议书
2015/09/14 职场文书
企业管理制度设计时要注意的几种“常见病”!
2019/04/19 职场文书
js之ajax文件上传
2021/05/13 Javascript
总结Java对象被序列化的两种方法
2021/06/30 Java/Android
python工具dtreeviz决策树可视化和模型可解释性
2022/03/03 Python