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读取xml
Nov 04 Javascript
js 解决“options为空或不是对象”
Dec 22 Javascript
基于jquery的时间段实现代码
Aug 02 Javascript
原生javascript实现隔行换色
Jan 04 Javascript
JavaScript动态设置div的样式的方法
Dec 26 Javascript
JavaScript Ajax实现异步通信
Dec 14 Javascript
JS排序之快速排序详解
Apr 08 Javascript
基于vue-cli搭建多模块且各模块独立打包的项目
Jun 12 Javascript
layui添加动态菜单与选项卡 AJAX请求的例子
Sep 25 Javascript
在VUE style中使用data中的变量的方法
Jun 19 Javascript
JavaScript实现动态生成表格
Aug 02 Javascript
基于element-ui封装表单金额输入框的方法示例
Jan 06 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
雄兵连三大错觉:凯莎没了,凉冰阵亡了,华烨觉得自己又行了
2020/04/09 国漫
php中的观察者模式
2010/03/24 PHP
深入解析php之apc
2013/05/15 PHP
浅析PHP Socket技术
2013/08/02 PHP
typecho插件编写教程(五):核心代码
2015/05/28 PHP
PHP开发中解决并发问题的几种实现方法分析
2017/11/13 PHP
tagName的使用,留一笔
2006/06/26 Javascript
ExtJS 学习专题(一) 如何应用ExtJS(附实例)
2010/03/11 Javascript
关于jquery append() html时的小问题的解决方法
2010/12/16 Javascript
jQuery 中使用JSON的实现代码
2011/12/01 Javascript
nodejs事件的监听与触发的理解分析
2015/02/12 NodeJs
js通过classname来获取元素的方法
2016/11/24 Javascript
自定义事件解决重复请求BUG的问题
2017/07/11 Javascript
vux uploader 图片上传组件的安装使用方法
2018/05/15 Javascript
IE9 elementUI文件上传的问题解决
2018/10/17 Javascript
详解Vue基于vue-quill-editor富文本编辑器使用心得
2019/01/03 Javascript
vue开发环境配置跨域的方法步骤
2019/01/16 Javascript
Node.JS在命令行中检查Chrome浏览器是否安装并打开指定网址
2019/05/21 Javascript
微信小程序基于Taro的分享图片功能实践详解
2019/07/12 Javascript
Ant Design Pro 下实现文件下载的实现代码
2019/12/03 Javascript
vue实现放大镜效果
2020/09/17 Javascript
Vue+Element自定义纵向表格表头教程
2020/10/26 Javascript
vant-ui框架的一个bug(解决切换后onload不触发)
2020/11/11 Javascript
利用Python实现Windows下的鼠标键盘模拟的实例代码
2017/07/13 Python
Python按钮的响应事件详解
2019/03/04 Python
对python while循环和双重循环的实例详解
2019/08/23 Python
浅谈TensorFlow之稀疏张量表示
2020/06/30 Python
HTML5 常见面试题之PC端和移动端区别介绍
2018/01/22 HTML / CSS
成人大专自我鉴定范文
2013/10/19 职场文书
校园歌手大赛策划书
2014/01/17 职场文书
公益广告语集锦
2014/03/13 职场文书
个人反四风对照检查材料思想汇报
2014/09/23 职场文书
2014小学教师年度考核工作总结
2014/12/03 职场文书
房屋产权证明书
2015/06/19 职场文书
教师节主题班会教案
2015/08/17 职场文书
kubernetes集群搭建Zabbix监控平台的详细过程
2022/07/07 Servers