nodejs实现同步操作想法实现

一些nodejs实现同步操作想法实现

nodejs中http://www.cr173.com/html/13900_1.html

 

 

 

     众所周知,异步是得天独厚的特点和优势,但同时在程序中同步的需求(比如控制程序的执行顺序为: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);
    }
  ]
);
时间: 2024-10-27 02:56:23

nodejs实现同步操作想法实现的相关文章

七天学会NodeJS (原生NodeJS 学习资料 来自淘宝技术团队)

NodeJS基础 什么是NodeJS JS是脚本语言,脚本语言都需要一个解析器才能运行.对于写在HTML页面里的JS,浏览器充当了解析器的角色.而对于需要独立运行的JS,NodeJS就是一个解析器. 每一种解析器都是一个运行环境,不但允许JS定义各种数据结构,进行各种计算,还允许JS使用运行环境提供的内置对象和方法做一些事情.例如运行在浏览器中的JS的用途是操作DOM,浏览器就提供了document之类的内置对象.而运行在NodeJS中的JS的用途是操作磁盘文件或搭建HTTP服务器,NodeJS

node.js中实现同步操作的3种实现方法

  众所周知,异步是得天独厚的特点和优势,但同时在程序中同步的需求(比如控制程序的执行顺序为:func1 -> func2 ->func3 )也是很常见的.本文就是对这个问题记录自己的一些想法. 需要执行的函数: 代码如下: var func1 = function(req,res,callback){ setTimeout(function(){ console.log('in func1'); callback(req,res,1); },13000); } var func2 = fun

阅读 NodeJS 文档,我学到了这 19 件事情

本文讲的是阅读 NodeJS 文档,我学到了这 19 件事情, 我相信我对 Node 了若指掌.我这 3 年来写的网站都是用 Node 来开发的.但实际上,我从没有详细查看 Node 文档. 长期的订阅者应该知道,我正处在书写每一个接口(interface),属性(prop),方法(method),函数(function),数据类型(data type)等等关于 Web 开发的漫漫长途中,这样可以填补我的知识面的空缺.在完成了 HTML,DOM, WebApi, CSS, SVG 和 EcmaS

Scott 带你掌握 Nodejs 打通全栈

本文约 7000 字,通读需要花费 5 分钟 大家好,我是 Scott,本文通过提供给大家学习的方法,以及我个人录制的一系列视频,帮助你更快更好的学习 Nodejs,了解前后端的 HTTP 知识,以及配置和使用阿里云 ECS 来部署你的 Nodejs 项目,成为那个具有争议的全栈开发工程师. 先简述下被很多新入行同学问到的问题,我从业 7 年,前 4 年在阿里巴巴做前端开发工程师,开发全网的通用创意模板,近 3 年在创业公司担任技术负责人,也就是听上去高大上的 CTO,我职业的前 6 年月工资不

十个最适合 Web 和 APP 开发的 NodeJS 框架

在浏览器以外运行 JavaScript 对于 JavaScript 爱好者来说非常神奇,同时也肯定是 web 应用程序开发界最受欢迎的进步之一.全球各地的开发者张开双臂拥抱 NodeJS. 对于新手来说,Node.js 是 JavaScript 运行时,允许你在浏览器之外服务器上运行 JavaScript 代码.它是基于谷歌 Chrome 的 V8 虚拟机引擎建立的,V8 虚拟机引擎用于在 Chrome 浏览器中支持 JavaScript. NodeJS 逐渐普及的步伐是因为它可以让你只使用 J

10 个最适合 Web 和 APP 开发的 NodeJS 框架

在浏览器以外运行 JavaScript 对于 JavaScript 爱好者来说非常神奇,同时也肯定是 web 应用程序开发界最受欢迎的进步之一.全球各地的开发者张开双臂拥抱 NodeJS. 对于新手来说,Node.js 是 JavaScript 运行时,允许你在浏览器之外服务器上运行 JavaScript 代码.它是基于谷歌 Chrome 的 V8 虚拟机引擎建立的,V8 虚拟机引擎用于在 Chrome 浏览器中支持 JavaScript. NodeJS 逐渐普及的步伐是因为它可以让你只使用 J

NodeJS反序列化RCE漏洞的完美利用

本文讲的是NodeJS反序列化RCE漏洞的完美利用,几天前,我在opsecx博客上注意到一篇博文,是谈论有关于利用nodejs的node-serialize模块中的RCE(远程执行代码)漏洞的文章. 文章很清楚地解释了存在安全问题的模块的详细信息,但有一件事情让我觉得不太妥当,使用Burp进行这个漏洞的利用,其过程比较复杂. 我没有攻击Burp不好用,相反,这是个极好的黑客工具 – 但我认为在这个漏洞的利用上我们可以做得更好. 在这篇文章中,我想说明一下我对这个特定的RCE漏洞的看法,也会分享一

在生产环境中使用 NODEJS 一年记

本文讲的是在生产环境中使用 NODEJS 一年记, 本文是「我为什么弃 Python 从 Node.js」一文的续集.一年多前,我因为对 Python 的挫败,还想解释为什么转而尝试 Node ,故写下那篇文章. 一年后,公司内部的 CLI(命令行) 工具,客户项目以及我司产品的更新,这些都是我学到的.不仅仅是 Node,基本上对 JavaScript 也学到不少. 易学难精 Node 学起来很容易,尤其是对有 JavaScript 的基础的人.谷歌搜索一些入门教程,折腾一会儿 Express,

nodejs初步体验篇_node.js

前言:写这篇文章的由来: 1.前段时间单位有新项目启动,服务端要做的工作不多也不算麻烦,就是处理一些中间层的服务,而且我们团队里面个个都会JavaScript,领导就决定试试服务器端的JavaScript,结果本人有幸被派去研究了几天Node,怀着鸡冻的心情开始了node.js的篇章,这篇文章也就是为这几天研究的总结. 2.一个JavaScript工程师如果没听过node.js那么我想你是不是错过了什么,每个优秀的前端工程师都有必要去了解后台处理流程,那么如果又能从JavaScript出发,岂不