【Nodejs】nimble或async并不能保证程序串行执行,回调是回避不了的坑
先看一段例程:
//-------------------------------
// 用于创建目录
//-------------------------------
function createFolder(){
console.log('准备创建目录');
folder='infos('+currDateTime()+")";
var fs=require('fs');
fs.mkdir('./'+folder,function(err){
if(err){
console.log("目录"+folder+"已经存在");
}else{
console.log("目录"+folder+"已创建");
}
});
}
//-------------------------------
// 入口函数
// start:起始页,从1开始
// end:终止页,>start
//-------------------------------
function main(start,end){
var flow=require('nimble');
flow.series([
function(callback){
setTimeout(function(){
console.log('First Job')
createFolder();
callback();
},1);
},
function(callback){
setTimeout(function(){
console.log('Second Job')
callback();
},1);
},
function(callback){
setTimeout(function(){
console.log('Third Job')
callback();
},1);
},
function(callback){
setTimeout(function(){
console.log('Forth Job')
callback();
},1);
},
]);
}
//--------------------------------------
// 通用函数,返回当前日期时间
//--------------------------------------
function currDateTime() {
var date = new Date();
var seperator1 = "-";
var seperator2 = "_";
var month = date.getMonth() + 1;
var strDate = date.getDate();
if (month >= 1 && month <= 9) {
month = "0" + month;
}
if (strDate >= 0 && strDate <= 9) {
strDate = "0" + strDate;
}
var currentdate =date.getFullYear() + seperator1 + month + seperator1 + strDate
+ " " + date.getHours() + seperator2 + date.getMinutes()
+ seperator2 + date.getSeconds();
return currentdate;
}
// 开始
main(1,10);
原以为它会这样运行:
C:\Users\horn1\Desktop\node.js\58-理想论坛爬虫1.04>node nimble.js First Job 准备创建目录 目录infos(2018-04-25 6_33_19)已创建 Second Job Third Job Forth Job
但它有时也这样运行:
C:\Users\horn1\Desktop\node.js\58-理想论坛爬虫1.04>node nimble.js First Job 准备创建目录 Second Job 目录infos(2018-04-25 6_34_3)已创建 Third Job Forth Job C:\Users\horn1\Desktop\node.js\58-理想论坛爬虫1.04>node nimble.js First Job 准备创建目录 Second Job 目录infos(2018-04-25 6_34_9)已创建 Third Job Forth Job
很明显,如果第二个任务是需要第一个任务的结果比如是folder的生成,那么运行中一定会出现异常,因为未必目录会在第二个任务执行前准备好。
下面让我们看看async的代码:
//-------------------------------
// 用于创建目录
//-------------------------------
function createFolder(){
console.log('准备创建目录');
folder='infos('+currDateTime()+")";
var fs=require('fs');
fs.mkdir('./'+folder,function(err){
if(err){
console.log("目录"+folder+"已经存在");
}else{
console.log("目录"+folder+"已创建");
}
});
}
//-------------------------------
// 入口函数
// start:起始页,从1开始
// end:终止页,>start
//-------------------------------
function main(start,end){
var async=require('async');
async.series([
function(done){
console.log('First job');
createFolder();
done();
},
function(done){
console.log('Second job');
done();
},
function(done){
console.log('Third job');
done();
},
function(done){
console.log('Forth job');
done();
},
]);
}
//--------------------------------------
// 通用函数,返回当前日期时间
//--------------------------------------
function currDateTime() {
var date = new Date();
var seperator1 = "-";
var seperator2 = "_";
var month = date.getMonth() + 1;
var strDate = date.getDate();
if (month >= 1 && month <= 9) {
month = "0" + month;
}
if (strDate >= 0 && strDate <= 9) {
strDate = "0" + strDate;
}
var currentdate =date.getFullYear() + seperator1 + month + seperator1 + strDate
+ " " + date.getHours() + seperator2 + date.getMinutes()
+ seperator2 + date.getSeconds();
return currentdate;
}
// 开始
main(1,10);
其运行结果有:
C:\Users\horn1\Desktop\node.js\58-理想论坛爬虫1.04>node async.js First job 准备创建目录 Second job Third job Forth job 目录infos(2018-04-25 6_43_21)已创建 C:\Users\horn1\Desktop\node.js\58-理想论坛爬虫1.04>node async.js First job 准备创建目录 Second job Third job Forth job 目录infos(2018-04-25 6_43_24)已创建
很明显,没有延时的帮助,四个任务都处理了,目录才创建完成,如果三个任务都依赖目录,那么异常就出现了。
之前在有些论坛上看到有人以程序里有二十多个回调括号大括号自矜,当时觉得这种方式程序并不好读好修改,现在看他也是不得已而为之。
Nodejs程序里回调始终是坑。
2018年4月25日06点53分
【Nodejs】nimble或async并不能保证程序串行执行,回调是回避不了的坑的更多相关文章
- NodeJs使用async让代码按顺序串行执行
描述 由于nodejs中的函数调用都是异步执行的,而笔者在工程开发中函数A需要四五个参数,而这四五个参数值都是通过函数调用获得,因此按顺序写代码时,执行到函数A时,往往函数A需要的参数值因为参数的异步 ...
- vue使用技巧:Promise + async + await 解决组件间串行编程问题
业务场景描述 大家都通过互联网投递过简历,比如在智联.58.猎聘等平台.投递心仪的职位前一般都需要前提创建一份简历,简历编辑界面常规的布局最上面是用户的个人基本信息,如姓名.性别.年龄.名族等,接着是 ...
- 【Nodejs】使用nimble串行化回调任务
nodejs的nimble模块可以使我们对回调任务进行串行化,它需要先安装 #npm install nimble 用法也方便,示例代码如下: //========================== ...
- async/await实现图片的串行、并行加载
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- nodejs进阶(7)—async异步流程控制
Async介绍 Async是一个流程控制工具包,提供了直接而强大的异步功能.基于Javascript为Node.js设计,同时也可以直接在浏览器中使用. Async提供了大约20个函数,包括常用的 m ...
- 进程与程序 并行 并发 串行 阻塞 join函数
进程是正在运行的程序,程序是程序员编写的一对代码,也就是一堆字符,当这堆代码被系统加载到内存并执行,就有了进程. (需要注意的是:一个程序是可以产生多个程序,就像我们可以同时运行多个QQ程序一样,会形 ...
- async/await 里的并行和串行
我们在使用 async/await 语法时,有时会这样用: function getName () { return new Promise((resolve, reject)=>{ setTi ...
- nodejs异步调用async
犹豫nodejs是异步编程模型,有一些在同步编程中很容易做到的事情,现在却变得很麻烦,async的流程控制就是为了简化这些操作var async = require('async'); 1.serie ...
- java 保证程序安全退出
以前在开发时只知道依靠数据库事务来保证程序关闭时数据的完整性. 但有些时候一个业务上要求的原子操作,不一定只包括数据库,比如外部接口或者消息队列.此时数据库事务就无能为力了. 这时我们可以依靠java ...
随机推荐
- [BalticOI2002]Bicriterial routing
OJ题号: BZOJ1375.ECNU1468 题目大意: 给定一个无向连通图,每条边有两个权值w1和w2.定义一条路径是优秀的当且仅当没有别的路径满足两个权值的和都比该路径小,求s到t的优秀路径条数 ...
- bzoj 1798: [Ahoi2009]Seq 维护序列seq 线段树 区间乘法区间加法 区间求和
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeO ...
- iOS录音后播放声音小,AudioSessionInitialize failed,AudioQueueStart failed (-50)
方法1: UInt32 audioRoute = kAudioSessionOverrideAudioRoute_Speaker; AudioSessionSetProperty(kAudioSess ...
- jconsole监控上Linux上的JVM
说明: 首先JConsole这个是JDK里面自带的工具 在JAVA_HOME/bin目录下,今天主要测试远程监控JVM 第一步:设置好需要远程机器的Tomcat 修改Tomcat下的配置文件:/us ...
- 你的C/C++程序为什么无法运行?揭秘Segmentation fault (2)
什么让你对C/C++如此恐惧? 本篇将继续上一篇来讨论段错误(Segmentation fault). 上一篇: 你的C/C++程序为什么无法运行?揭秘Segmentation fault(1) 追溯 ...
- [Phonegap+Sencha Touch] 移动开发18 Sencha Touch项目通过phonegap打包后的程序名字的问题
之前说过 sencha phonegap init com.pushsoft.myapp MyApp 之后打包的程序安装包apk的名字是"MyApp.apk",显示在手机桌面上的程 ...
- CAN 总线通信控制芯片SJA1000 的读写
SJA1000 控制信号的产生 CAN总线通信控制芯片SJA1000 没有提供单独的地址线,而使用可以与Intel 和Motorola系列微控制器兼容的分时复用地址/ 数据线.在一个读写周期内,微控制 ...
- hybrid App h5二级页面返回的时候保持与一级页面浏览的位置一致
最近在开发公司hybrid app的时候,需要将原本原生的配置中心模块统一变更为H5,做完之后从测试那里反馈回来这样一个问题,当滑到页面底部或中部的时候进入子页面进行设置,返回的时候页面应该定位到离开 ...
- 为DropDownListFor设置选中项
在MVC中,当涉及到强类型编辑页,如果有select元素,需要根据当前Model的某个属性值,让Select的某项选中.本篇只整理思路,不涉及完整代码. □ 思路 往前台视图传的类型是List< ...
- Starting nginx: nginx: [emerg] bind() to 0.0.0.0:8088 failed (13: Permission denied) nginx 启动失败
Starting nginx: nginx: [emerg] bind() to 0.0.0.0:8088 failed (13: Permission denied) nginx 启动失败 ...