node模块机制与异步处理详解

1.模块机制

commonJS模块机制出现的目的是为了构建js在web服务器,桌面程序,浏览器等方面形成生态系统。而node js就是这种规范的一种实现,用requird来引入其他文件,同样,npm也遵循了commonJS定义的包规范,从而形成了一套完整的生态系统。

模块定义并导出

例如有如下一个名为circle.js的文件

exports.getName = function(name) {
  return name
}

模块载入

var circle = require('/circle.js')
console.log(circle.getName('WPY'))

模块加载策略

node模块主要可以分为两类:

原生模块和自定义模块,所谓原生模块就是node自己定义的模块,例如HTTP,fs模块,此类模块加载速度最快。
还有一类是自定义模块,包括包模块,和我们自己定义的文件。无论是原生模块还是自定义模块在第一次加载后都会被node缓存,所以第二次请求时是不会有开销的。

原生模块加载:

require()方法在解析文件名之后,最优先在模块缓存中查找,然后在node的原生模块中查找
从文件加载
module.path 对于每一个被加载的文件模块,在创建这个模块对象的时候都会有一个paths属性。其路径指向引入模块的路径。
在请求绝对路径模块时,不会去遍历node_module加载速度最快。

异步编程

高介函数
高介函数是将函数作为参数,或者作为返回值的函数。

function foo(X) {
  return function() {
    return x
  }
}

NODE带来的最大特性莫过于机遇事件驱动的非阻塞IO。

异步编程解决方案

1.事件发布/订阅模式

事件监听器模式是广泛应用于异步编程,是回调函数的时间化,又称发布/订阅模式。

//订阅

emitter.on("event1", function(message){
  console.log(message)
})
//发布

emitter.emit("event1", "I am message")

2.Promise模式

promise对象具有三种状态,未完成态,完成态,失败态。
promise对象要具有then方法,对于then 方法有以下几点要求

1.接受完成态,错误态的回调方法。
2.只接受function,其余对象将被忽略
3.继续返回promise对象,以实现链式调用

(0)

相关推荐

  • 从零学习node.js之详解异步控制工具async(八)

    前言 大家在编写异步程序时,最头痛的就是不知道结果什么时候返回给我们,然后执行后面的操作,很多时候只能把后面的操作放到返回成功的函数里,或者使用计数器等方法. 比较典型的两个就是:后面的操作需要依赖上一个异步操作的结果:多个异步操作并行执行,都执行完成后再执行接下来的操作. 这两个操作中,第一个异步的程序我们可能会写成这样: db.select(SQL1, function(res1){ db.delete(SQL2, function(res2){ db.insert(SQL3, functi

  • Nodejs爬虫进阶教程之异步并发控制

    之前写了个现在看来很不完美的小爬虫,很多地方没有处理好,比如说在知乎点开一个问题的时候,它的所有回答并不是全部加载好了的,当你拉到回答的尾部时,点击加载更多,回答才会再加载一部分,所以说如果直接发送一个问题的请求链接,取得的页面是不完整的.还有就是我们通过发送链接下载图片的时候,是一张一张来下的,如果图片数量太多的话,真的是下到你睡完觉它还在下,而且我们用nodejs写的爬虫,却竟然没有用到nodejs最牛逼的异步并发的特性,太浪费了啊. 思路 这次的的爬虫是上次那个的升级版,不过呢,上次那个虽

  • 详谈nodejs异步编程

    目前需求中涉及到大量的异步操作,实际的页面越来越倾向于单页面应用.以后可以会使用backbone.angular.knockout等框架,但是关于异步编程的问题是首先需要面对的问题.随着node的兴起,异步编程成为一个非常热的话题.经过一段时间的学习和实践,对异步编程的一些细节进行总结. 1.异步编程的分类 解决异步问题方法大致包括:直接回调.pub/sub模式(事件模式).异步库控制库(例如async.when).promise.Generator等. 1.1 回调函数 回调函数是常用的解决异

  • 深入浅析NodeJs并发异步的回调处理

    这里说并发异步,并不准确,应该说连续异步.NodeJs单线程异步的特性,直接导致多个异步同时进行时,无法确定最后的执行结果来回调.举个简单的例子: for(var i = 0; i < 5; i++) { fs.readFile('file', 'utf-8', function(error, data){}); } 连续发起了5次读文件的异步操作,很简单,那么问题来了,我怎么确定所有异步都执行完了呢?因为要在它们都执行完后,才能进行之后的操作.相信有点经验的同学都会想到使用记数的方式来进行,但

  • 浅谈node.js中async异步编程

    1.什么是异步编程? 异步编程是指由于异步I/O等因素,无法同步获得执行结果时, 在回调函数中进行下一步操作的代码编写风格,常见的如setTimeout函数.ajax请求等等. 示例: for (var i = 1; i <= 3; i++) { setTimeout(function(){ console.log(i); }, 0); }; 这里大部分人会认为输出123,或者333.其实它会输出 444 这里就是我们要说的异步编程了. 高级函数的定义 这里为什么会说到高级函数,因为高级函数是异

  • node模块机制与异步处理详解

    1.模块机制 commonJS模块机制出现的目的是为了构建js在web服务器,桌面程序,浏览器等方面形成生态系统.而node js就是这种规范的一种实现,用requird来引入其他文件,同样,npm也遵循了commonJS定义的包规范,从而形成了一套完整的生态系统. 模块定义并导出 例如有如下一个名为circle.js的文件 exports.getName = function(name) { return name } 模块载入 var circle = require('/circle.js

  • Node.js+Express配置入门教程详解

    Node.js是一个Javascript运行环境(runtime).实际上它是对Google V8引擎进行了封装.V8引 擎执行Javascript的速度非常快,性能非常好.Node.js对一些特殊用例进行了优化,提供了替代的API,使得V8在非浏览器环境下运行得更好.Node.js是一个基于Chrome JavaScript运行时建立的平台, 用于方便地搭建响应速度快.易于扩展的网络应用.Node.js 使用事件驱动, 非阻塞I/O 模型而得以轻量和高效,非常适合在分布式设备上运行的数据密集型

  • 在Node.js中使用Javascript Generators详解

    Generators是Javascript的一种协同程序( coroutine 简称:协程)风格,是指那些可以在执行时暂停然后又恢复的函数,该函数是在functi配以星号符号形式如function* ,函数内有些特征关键词如yield 和yield*. function* generatorFn () { console.log('look ma I was suspended') } var generator = generatorFn() // [1] setTimeout(functio

  • Spring中@Async注解实现异步调详解

    异步调用 在解释异步调用之前,我们先来看同步调用的定义:同步就是整个处理过程顺序执行,当各个过程都执行完毕,并返回结果. 异步调用则是只是发送了调用的指令,调用者无需等待被调用的方法完全执行完毕,继续执行下面的流程.例如, 在某个调用中,需要顺序调用 A, B, C三个过程方法:如他们都是同步调用,则需要将他们都顺序执行完毕之后,过程才执行完毕: 如B为一个异步的调用方法,则在执行完A之后,调用B,并不等待B完成,而是执行开始调用C,待C执行完毕之后,就意味着这个过程执行完毕了. 概述说明 Sp

  • Pytorch图像处理注意力机制解析及代码详解

    什么是注意力机制 注意力机制是一个非常有效的trick,注意力机制的实现方式有许多,我们一起来学习一下 注意力机制是深度学习常用的一个小技巧,它有多种多样的实现形式,尽管实现方式多样,但是每一种注意力机制的实现的核心都是类似的,就是注意力. 注意力机制的核心重点就是让网络关注到它更需要关注的地方. 当我们使用卷积神经网络去处理图片的时候,我们会更希望卷积神经网络去注意应该注意的地方,而不是什么都关注,我们不可能手动去调节需要注意的地方,这个时候,如何让卷积神经网络去自适应的注意重要的物体变得极为

  • RocketMq 消息重试机制及死信队列详解

    目录 生产者消息重试 消费者消息重试 并发消费 顺序消费 并发消费和顺序消费区别 死信队列 实践出真知 公共部分创建 测试并发消费 并发消费状态 测试顺序消费 顺序消费状态 测试死信队列 死信队列特性 生产者消息重试 消息队列中的消息消费时并不能保证总是成功的,那失败的消息该怎么进行消息补偿呢?这就用到今天的主角消息重试和死信队列了. 有时因为网路等原因生产者也可能发送消息失败,也会进行消息重试,生产者消息重试比较简单,在springboot中只要在配置文件中配置一下就可以了. # 异步消息发送

  • Netty的Handler链调用机制及如何组织详解

    目录 什么是 Handler Handler 是怎么被组织起来的 Handler 链调用机制 简述 ChannelPipeline 如何调度 handler 什么是 Handler Netty是一款基于NIO的异步事件驱动网络应用框架,其核心概念之一就是Handler.而Handler是Netty中处理事件的核心组件,用于处理入站和出站的数据流,实现业务逻辑和网络协议的处理. 在Netty中,Handler是一个接口,主要分为两种:ChannelInboundHandler(入站Handler)

  • Python3 模块、包调用&路径详解

    如下所示: ''' 以下代码均为讲解,不能实际操作 ''' ''' 博客园 Infi_chu ''' ''' 模块的优点: 1.高可维护性 2.可以大大减少编写的代码量 模块一共有三种: 1.Python标准库 2.第三方模块 3.应用程序自定义模块 ''' # import example # 调用example模块 # from example import example # 调用example模块中的一个example方法 ''' 博客园 Infi_chu ''' ''' 包的特点: 1

  • log4j2异步Logger(详解)

    1 异步Logger的意义 之前的日志框架基本都实现了AsyncAppender,被证明对性能的提升作用非常明显. 在log4j2日志框架中,增加了对Logger的异步实现.那么这一步的解耦,意义何在呢? 如图,按我目前的理解:异步Logger是让业务逻辑把日志信息放入Disruptor队列后可以直接返回(无需等待"挂载的各个Appender"都取走数据) 优点:更高吞吐.调用log方法更低的延迟. 缺点:异常处理麻烦. 可变日志消息问题.更大的CPU开销.需要等待"最慢的A

  • C++ 线程(串行 并行 同步 异步)详解

    C++  线程(串行 并行 同步 异步)详解 看了很多关于这类的文章,一直没有总结.不总结的话就会一直糊里糊涂,以下描述都是自己理解的非官方语言,不一定严谨,可当作参考. 首先,进程可理解成一个可执行文件的执行过程.在ios app上的话我们可以理解为我们的app的.ipa文件执行过程也即app运行过程.杀掉app进程就杀掉了这个app在系统里运行所占的内存. 线程:线程是进程的最小单位.一个进程里至少有一个主线程.就是那个main thread.非常简单的app可能只需要一个主线程即UI线程.

随机推荐