nodejs 中的异步之殇
nodejs 中的异步之殇
终于再次回到 nodejs 异步中,以前我以为异步在我写的文章中,已经写完了,现在才发现,还是有很多的地方没有想清楚,下面来一一说明。
模块同步与连接异步
大家应该,经常使用 express 进行网站开发。express 本来的问题不是重点,你肯定要用到第三工具,redis, mysql 了之类的。
redis 需要连接,而连接成功需要一个回调(他是一个异步)。问题就在这里,这个问题是:倒底是 redis 先连接成功,还是 express 先启动成功?
redis.on('ready', cb);
app.listen(300, cb);
哪个先成功?如果你认为我的问题不太明白,我们把 redis 的准备成功的时间拉长,变成 10 分钟,这样你就看出来了, redis 还没有准备好, express 就运行了,网站成功运行了。如果 redis 是紧紧做为缓存还好,如果是一些有用的数据,那可能就会有用户不可以访问网站,你可以把 redis 换成别的组件,就是说 nodejs 中的异步已经影响到了组件中,但是你还是按同步的思路去使用,去引用。
这就需要有说明,组件的启动顺序,保证组件连接正常,才能启动网站。
从根上进行控制
从哪里处理呢?
我认为还是要从根上进行处理, nodejs 中的异步不能保证顺序,不能保证你放在前面的代码就一定在前端运行。你需要的是从根上描述你的模块的依赖和启动顺序,这样就能保证网站的可用性。
但这样写可以吗?
redis.on('ready', () =>{
app.listen(300, cb)
})
可以是可以,但是你不觉得很难受吗?
因此,我的做法,所以有模块的启动顺序,都要用一个函数说明,保证启动顺序和依赖,这样里我用是的 async.auto 模块,他能显式说明函数的顺序:
const async = require('async')
function main() {
async.auto({
config(cb) {
cb(null, require('./config'))
},
logger: ['config', (scope, cb) => {
const logger = require('./module/logger')(scope.config)
cb(null, logger)
}],
redis: ['config', (scope, cb) => {
const redis = require('./module/redis')
cb(null, redis)
}],
util(cb) {
cb(null, require('./module/util'))
},
module: ['util', 'logger', 'redis', (scope, cb) => {
cb()
}],
web: ['config', 'module',(scope, cb) => {
const web = require('./web')(scope, cb)
}],
ready: ['module', 'web', (scope, cb) => {
cb()
}]
}, function(err, scope) {
const logger = scope.logger
logger.info('app running')
})
}
main()
这就是我的函数, web 模块也是组织进来,这样就可以在 web 启动时,第三方的模块都准备好。
想通了这点,我把我自己的项目重写了一遍,欢迎围观:
nodejs 中的异步之殇的更多相关文章
- NodeJS中的异步I/O、事件驱动
nodejs的主要特点是单线程.异步I/O.事件驱动.让我们先大概了解一下这些名词的意思. 单线程 单线程是任务按照顺序执行的,并且每次只执行一个任务,只有前面的任务执行完成以后,后面的任务才执行.在 ...
- 如何优雅的处理Nodejs中的异步回调
前言 Nodejs最大的亮点就在于事件驱动, 非阻塞I/O 模型,这使得Nodejs具有很强的并发处理能力,非常适合编写网络应用.在Nodejs中大部分的I/O操作几乎都是异步的,也就是我们处理I/O ...
- 深入理解nodejs中的异步编程
目录 简介 同步异步和阻塞非阻塞 javascript中的回调 回调函数的错误处理 回调地狱 ES6中的Promise 什么是Promise Promise的特点 Promise的优点 Promise ...
- NodeJS中常见异步接口定义(get、post、jsonp)
越来越多的人在使用nodeJS,作为一门服务端语言,我们不可避免的要写异步接口(ajax和jsonp).再次强调ajax和jsonp是两个概念,但是由于jquery的封装,使这两种异步接口的调用方式, ...
- nodejs中的异步回调机制
1.再次clear Timer定时器的作用 setTimeOut绝非是传统意义上的“sleep”功能,它做不到让主线程“熄火”指定时间,它是用来指定:某个回调在固定时间后插入执行栈!(实际执行时间略长 ...
- nodejs中的异步流程序控制nsync
异步编程是指由于异步I/O等因素,无法同步获得执行结果时, 在回调函数中进行下一步操作的代码编写风格,常见的如setTimeout函数.ajax请求等等 http://cnodejs.org/topi ...
- Nodejs中使用异步流程控制Async
首先,我们都知道,Node基于事件驱动的异步I/O架构,所谓异步就是非阻塞,说白了就是一个事件执行了,我不必等待它执行完成后我才能执行下一个事件.所以在Node环境中的模块基本都是异步的,上一篇说到我 ...
- nodejs中异步
nodejs中的异步 1 nodejs 中的异步存在吗? 现在有点 javascript 基础的人都在听说过 nodejs ,而只要与 javascript 打交到人都会用或者是将要使用 nodejs ...
- 在Nodejs中如何调用C#的代码
最近需要在Nodejs中用到C#的代码,从网上了解到可以采用Edgejs来实现Nodejs与C#的代码交互, 直接复制网上的代码运行总是出各种错,填了不少坑,现在把自己的案例代码大致整理一下,方便以后 ...
随机推荐
- Virtual Codeforces Round #392 (Div. 2)
下午闲来无事开了一场Virtual participation 2h就过了3道水题...又跪了..这只是Div. 2啊!!! 感觉这次直接就是跪在了读题上,T1,T2读题太慢,T3还把题读错了 要是让 ...
- poj3281Dining——网络流匹配
题目:http://poj.org/problem?id=3281 网络流做图中的匹配,注意为了限制每头牛只匹配一种食物和一种饮料,要把牛拆成两个点,之间连边权为1的边. 代码如下: #include ...
- ASCII字符点阵字库的制作和使用
转自:http://blog.csdn.net/exbob/article/details/6532772 开发环境: Win7,Eclipse,MinGW 1.生成ASCII字符文件 ASCII编码 ...
- android apk 防止反编译技术第二篇-运行时修改字节码
上一篇我们讲了apk防止反编译技术中的加壳技术,如果有不明白的可以查看我的上一篇博客http://my.oschina.net/u/2323218/blog/393372.接下来我们将介绍另一种防止a ...
- [hdu2087]剪花布条(KMP)
题意:求存在模式串个数,不可重复. 解题关键:模板题.整理模板用.重复和不可重复的区别在下面已标出.主要是j的变化. #include<cstdio> #include<cstrin ...
- 安装完SAP后BASIS的配置流程
安装完SAP后BASIS配置流程 安装完SAP后,配置流程. 1.升级kernel. 2.TCD SLICENSE: License Administration install > Syste ...
- HRBUST - 1819 石子合并问题--圆形版(区间dp+环形+四边形优化)
石子合并问题--圆形版 在圆形操场上摆放着一行共n堆的石子.现要将石子有序地合并成一堆.规定每次只能选相邻的两堆合并成新的一堆,并将新的一堆石子数记为该次合并的得分.请编辑计算出将n堆石子合并成一堆的 ...
- 从网络架构方面简析循环神经网络RNN
一.前言 1.1 诞生原因 在普通的前馈神经网络(如多层感知机MLP,卷积神经网络CNN)中,每次的输入都是独立的,即网络的输出依赖且仅依赖于当前输入,与过去一段时间内网络的输出无关.但是在现实生活中 ...
- 痞子衡嵌入式:微处理器CPU性能测试基准(Dhrystone)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是微处理器CPU性能测试基准Dhrystone. 在嵌入式系统行业用于评价CPU性能指标的标准主要有三种:Dhrystone.MIPS.C ...
- IDEA Maven Mybatis generator 自动生成代码(实例讲解)(转)
IDEA Maven Mybatis generator 自动生成代码(实例讲解) MyBatis Generator • 简称MBG,是一个专门为MyBatis框架使用者定制的代码生成器,可以快速的 ...