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 js cookie的存储,获取和删除
Dec 29 Javascript
深入理解JavaScript系列(35):设计模式之迭代器模式详解
Mar 03 Javascript
Angularjs 滚动加载更多数据
Mar 17 Javascript
JS组件Bootstrap ContextMenu右键菜单使用方法
Apr 17 Javascript
Javascript之Date对象详解
Jun 07 Javascript
轻松掌握JavaScript装饰者模式
Aug 27 Javascript
微信小程序支付前端源码
Aug 29 Javascript
vuex管理状态 刷新页面保持不被清空的解决方案
Nov 11 Javascript
vue使用原生swiper代码实例
Feb 05 Javascript
JS将指定的某个字符全部转换为其他字符实例代码
Oct 13 Javascript
WebStorm中如何将自己的代码上传到github示例详解
Oct 28 Javascript
vue mvvm数据响应实现
Nov 11 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
syphon 虹吸式咖啡冲泡冲煮倒水的得与失
2021/03/03 冲泡冲煮
学习php设计模式 php实现单例模式(singleton)
2015/12/07 PHP
javascript编程起步(第五课)
2007/01/10 Javascript
javascript随机将第一个dom中的图片添加到第二个div中示例
2013/10/08 Javascript
鼠标划过实现延迟加载并隐藏层的js代码
2013/10/11 Javascript
js中通过父级进行查找定位元素
2014/06/15 Javascript
js和jquery如何获取图片真实的宽度和高度
2014/09/28 Javascript
简单实现限制uploadify上传个数
2015/11/16 Javascript
使用jQuery判断Div是否在可视区域的方法 判断div是否可见
2016/02/17 Javascript
JavaScript实现多种排序算法
2016/02/24 Javascript
基于javascript实现按圆形排列DIV元素(三)
2016/12/02 Javascript
js中Number数字数值运算后值不对的解决方法
2017/02/28 Javascript
NodeJS创建最简单的HTTP服务器
2017/05/15 NodeJs
简单谈谈CommonsChunkPlugin抽取公共模块
2017/12/31 Javascript
Node.js Windows Binary二进制文件安装方法
2019/05/16 Javascript
js实现点赞效果
2020/03/16 Javascript
Vue路由守卫及页面登录权限控制的设置方法(两种)
2020/03/31 Javascript
使用JavaScript获取扫码枪扫描得到的条形码的思路代码详解
2020/06/10 Javascript
[00:52]DOTA2齐天大圣预告片
2016/08/13 DOTA
pandas中Timestamp类用法详解
2017/12/11 Python
Python 旋转打印各种矩形的方法
2019/07/09 Python
Django自定义模板过滤器和标签的实现方法
2019/08/21 Python
关于tf.TFRecordReader()函数的用法解析
2020/02/17 Python
解决Django提交表单报错:CSRF token missing or incorrect的问题
2020/03/13 Python
纯css3实现图片翻牌特效
2015/03/10 HTML / CSS
What is the purpose of Void class? Void类的作用是什么?
2016/10/31 面试题
工厂厂长岗位职责
2013/11/08 职场文书
2014年客户经理工作总结
2014/11/20 职场文书
护士2015年终工作总结
2015/04/29 职场文书
入党介绍人考察意见
2015/06/01 职场文书
公司周年庆寄语
2019/06/21 职场文书
创业计划书之家政服务
2019/09/18 职场文书
浅析InnoDB索引结构
2021/04/05 MySQL
Python机器学习之KNN近邻算法
2021/05/14 Python
Vue接口封装的完整步骤记录
2021/05/14 Vue.js
如何解决.cuda()加载用时很长的问题
2021/05/24 Python