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 相关文章推荐
jquery 简短右键菜单 多浏览器兼容
Jan 01 Javascript
获取dom元素那些讨厌的位置封装代码
Jun 23 Javascript
JavaScript编程的10个实用小技巧
Apr 18 Javascript
移动端JQ插件hammer使用详解
Jul 03 Javascript
js如何实现淡入淡出效果
Nov 18 Javascript
利用VUE框架,实现列表分页功能示例代码
Jan 12 Javascript
Node连接mysql数据库方法介绍
Feb 07 Javascript
jquery在vue脚手架中的使用方式示例
Aug 29 jQuery
JS解析后台返回的JSON格式数据实例
Aug 06 Javascript
jQuery Ajax实现Select多级关联动态绑定数据的实例代码
Oct 26 jQuery
p5.js临摹旋转爱心
Oct 23 Javascript
vue 使用lodash实现对象数组深拷贝操作
Sep 10 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
抓取并下载CSS中所有图片文件的php代码
2011/09/26 PHP
IIS安装Apache伪静态插件的具体操作图文
2013/07/01 PHP
smarty自定义函数用法示例
2016/05/20 PHP
PHP实现负载均衡下的session共用功能
2018/04/17 PHP
分析php://output和php://stdout的区别
2018/05/06 PHP
jquery的$(document).ready()和onload的加载顺序
2010/05/26 Javascript
toggle一个div显示或隐藏且可扩展成自定义下拉框
2013/09/12 Javascript
jquery退出each循环的写法
2014/02/26 Javascript
基于NodeJS的前后端分离的思考与实践(二)模版探索
2014/09/26 NodeJs
用js读、写、删除Cookie代码续篇
2014/12/03 Javascript
javascript中cookie对象用法实例分析
2015/01/30 Javascript
JavaScript数组前面插入元素的方法
2015/04/06 Javascript
每天一篇javascript学习小结(String对象)
2015/11/18 Javascript
JS比较两个数值的大小实例
2016/11/25 Javascript
说说如何在Vue.js中实现数字输入组件的方法
2019/01/08 Javascript
Vue form表单动态添加组件实战案例
2019/09/02 Javascript
小程序实现录音功能
2020/09/22 Javascript
[07:40]DOTA2每周TOP10 精彩击杀集锦vol.4
2014/06/25 DOTA
使用Python解析JSON数据的基本方法
2015/10/15 Python
Python的SQLalchemy模块连接与操作MySQL的基础示例
2016/07/11 Python
浅谈python 里面的单下划线与双下划线的区别
2017/12/01 Python
python thrift搭建服务端和客户端测试程序
2018/01/17 Python
python写入文件自动换行问题的方法
2019/07/05 Python
pandas进行时间数据的转换和计算时间差并提取年月日
2019/07/06 Python
Python closure闭包解释及其注意点详解
2019/08/28 Python
Python pandas 列转行操作详解(类似hive中explode方法)
2020/05/18 Python
解决Python import .pyd 可能遇到路径的问题
2021/03/04 Python
印度购买眼镜和太阳镜网站:Coolwinks
2018/09/26 全球购物
Madda Fella官网:美国冒险家服装品牌
2020/01/16 全球购物
自主招生自荐信
2013/12/08 职场文书
大学生会计职业生涯规划范文
2014/02/28 职场文书
群众路线教育实践活动调研报告
2014/11/03 职场文书
2016七夕情人节广告语
2016/01/28 职场文书
Python实现拼音转换
2021/06/07 Python
JavaScript事件的委托(代理)的用法示例详解
2022/02/18 Javascript
MySQL中EXPLAIN语句及用法
2022/05/20 MySQL