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 相关文章推荐
手把手教你自己写一个js表单验证框架的方法
Sep 14 Javascript
JavaScript快速检测浏览器对CSS3特性的支持情况
Sep 26 Javascript
jquery.ui.draggable中文文档(原文翻译)
Nov 15 Javascript
js文件Cookie存取值示例代码
Feb 20 Javascript
如何实现chrome浏览器关闭页面时弹出“确定要离开此面吗?”
Mar 05 Javascript
JavaScript Split()方法
Dec 18 Javascript
基于jquery插件编写countdown计时器
Jun 12 Javascript
微信小程序实现多个按钮toggle功能的实例
Jun 13 Javascript
详解vue-cli中配置sass
Jun 21 Javascript
利用纯js + transition动画实现移动端web轮播图详解
Sep 10 Javascript
JS面向对象编程基础篇(二) 封装操作实例详解
Mar 03 Javascript
tracking.js实现前端人脸识别功能
Apr 16 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 生成随机验证码图片代码
2010/02/08 PHP
php 图片加水印与上传图片加水印php类
2010/05/12 PHP
PHP+SQL 注入攻击的技术实现以及预防办法
2010/12/29 PHP
Yii使用ajax验证显示错误messagebox的解决方法
2014/12/03 PHP
php实现有序数组打印或排序的方法【附Python、C及Go语言实现代码】
2016/11/10 PHP
JavaScript 异步调用框架 (Part 4 - 链式调用)
2009/08/04 Javascript
JS跨域总结
2012/08/30 Javascript
两个listbox实现选项的添加删除和搜索
2013/03/01 Javascript
关于eval 与new Function 到底该选哪个?
2013/04/17 Javascript
JS中for循序中延迟加载动态效果的具体实现
2013/08/18 Javascript
JS自定义对象实现Java中Map对象功能的方法
2015/01/20 Javascript
下雪了 javascript实现雪花飞舞
2020/08/02 Javascript
Bootstrap中的Dropdown下拉菜单更改为悬停(hover)触发
2016/08/31 Javascript
vue.js数据绑定的方法(单向、双向和一次性绑定)
2017/07/13 Javascript
ES6 更易于继承的类语法的使用
2019/02/11 Javascript
微信小程序开发常见问题及解决方案
2019/07/11 Javascript
使用vue实现一个电子签名组件的示例代码
2020/01/06 Javascript
three.js欧拉角和四元数的使用方法
2020/07/26 Javascript
wxPython中listbox用法实例详解
2015/06/01 Python
python简单图片操作:打开\显示\保存图像方法介绍
2017/11/23 Python
python读取图片并修改格式与大小的方法
2018/07/24 Python
如何利用python制作时间戳转换工具详解
2018/09/12 Python
Python函数装饰器实现方法详解
2018/12/22 Python
python执行精确的小数计算方法
2019/01/21 Python
Win10+GPU版Pytorch1.1安装的安装步骤
2019/09/27 Python
tensorflow -gpu安装方法(不用自己装cuda,cdnn)
2020/01/20 Python
在Ubuntu 20.04中安装Pycharm 2020.1的图文教程
2020/04/30 Python
python 动态绘制爱心的示例
2020/09/27 Python
matplotlib之多边形选区(PolygonSelector)的使用
2021/02/24 Python
Skyscanner阿联酋:全球领先的旅游搜索平台
2017/11/25 全球购物
The North Face意大利官网:服装、背包和鞋子
2020/06/17 全球购物
合作协议书
2014/04/23 职场文书
党的群众路线教育实践活动自我剖析材料
2014/10/08 职场文书
王亚平太空授课观后感
2015/06/12 职场文书
JavaScript实现简单计时器
2021/06/22 Javascript
Mysql多层子查询示例代码(收藏夹案例)
2022/03/31 MySQL