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 匿名函数的理解(透彻版)
Jan 28 Javascript
基于jQuery的360图片展示实现代码
Jun 14 Javascript
node.js中的fs.readSync方法使用说明
Dec 17 Javascript
js实现class样式的修改、添加及删除的方法
Jan 20 Javascript
jQuery实现产品对比功能附源码下载
Aug 09 Javascript
jQuery实现对象转为url参数的方法
Jan 11 Javascript
荐书|您有一份JavaScript书单待签收
Jul 21 Javascript
React数据传递之组件内部通信的方法
Dec 31 Javascript
基于百度地图api清除指定覆盖物(Overlay)的方法
Jan 26 Javascript
webpack4 SCSS提取和懒加载的示例
Sep 03 Javascript
关于layui 弹出层一闪而过就消失的解决方法
Sep 09 Javascript
解决layui页面按钮点击无反应,也不报错的问题
Sep 29 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+jQuery实现自动补全功能源码
2013/05/15 PHP
使用YUI+Ant 实现JS CSS压缩
2014/09/02 PHP
WordPress中获取所使用的模板的页面ID的简单方法
2015/12/31 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
javascript 树控件 比较好用
2009/06/11 Javascript
Prototype Number对象 学习
2009/07/19 Javascript
javascript 模式设计之工厂模式详细说明
2010/05/10 Javascript
用JS实现3D球状标签云示例代码
2013/12/01 Javascript
JavaScript中的cacheStorage使用详解
2015/07/29 Javascript
javascript设置文本框光标的方法实例小结
2016/11/04 Javascript
基于JavaScript实现复选框的全选和取消全选
2017/02/09 Javascript
Angular.Js中过滤器filter与自定义过滤器filter实例详解
2017/05/08 Javascript
详解angularjs的数组传参方式的简单实现
2017/07/28 Javascript
VsCode新建VueJs项目的详细步骤
2017/09/23 Javascript
js截取字符串功能的实现方法
2017/09/27 Javascript
vue2.0$nextTick监听数据渲染完成之后的回调函数方法
2018/09/11 Javascript
jsonp跨域获取百度联想词的方法分析
2019/05/13 Javascript
使用Vue实现移动端左滑删除效果附源码
2019/05/16 Javascript
[12:29]《一刀刀一天》之DOTA全时刻19:蝙蝠骑士田伯光再度不举
2014/06/10 DOTA
[01:16:16]DOTA2-DPC中国联赛定级赛 RNG vs Phoenix BO3第二场 1月8日
2021/03/11 DOTA
python字符串排序方法
2014/08/29 Python
Python3之简单搭建自带服务器的实例讲解
2018/06/04 Python
Flask框架使用DBUtils模块连接数据库操作示例
2018/07/20 Python
Python中的枚举类型示例介绍
2019/01/09 Python
使用python实现回文数的四种方法小结
2019/11/24 Python
基于python读取.mat文件并取出信息
2019/12/16 Python
Django 解决新建表删除后无法重新创建等问题
2020/05/21 Python
Python pandas如何向excel添加数据
2020/05/22 Python
垃圾回收的优点和原理。并考虑2种回收机制
2016/10/16 面试题
斯福泰克软件测试面试题
2015/02/16 面试题
mysql有关权限的表都有哪几个
2015/04/22 面试题
导师就业推荐信范文
2014/05/22 职场文书
2015年幼儿园中班工作总结
2015/04/25 职场文书
2015年科研工作总结范文
2015/05/13 职场文书
暖春观后感
2015/06/08 职场文书
2015年第31个教师节致辞
2015/07/31 职场文书