【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 ...
随机推荐
- Educational Codeforces Round 45 (Div 2) (A~G)
目录 Codeforces 990 A.Commentary Boxes B.Micro-World C.Bracket Sequences Concatenation Problem D.Graph ...
- [Agc011F] Train Service Planning
[Agc011F] Train Service Planning 题目大意: 有n+1个车站,n条轨道,第i条轨道联通i-1和i车站,通过它要花a[i]时间,这条轨道有b[i]=1或2条车道,也就是说 ...
- SQL SERVER 2008 多边形问题的解决
报错内容: 在执行用户定义例程或聚合 "geometry" 期间出现 .NET Framework 错误: System.ArgumentException: 24144: 由于该 ...
- 【洛谷】3953:逛公园【反向最短路】【记忆化搜索(DP)统计方案】
P3953 逛公园 题目描述 策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条 ...
- the elements of computing systems 的读书笔记2
懒癌发作,本来计划是两到三天就一个unit的,没想到一直拖到今天才完成第二部分(6-8章). 第6章,介绍了hack汇编到二进制,也就是用翻译到01来表示.从课后习题来看,这一章目的就是设计一个程序( ...
- python开发_tkinter_图形随鼠标移动
做这个东西的时候,灵感源自于一个js效果: 两个眼睛随鼠标移动而移动 运行效果: =============================================== 代码部分: ===== ...
- BZOJ 1208: [HNOI2004]宠物收养所 SET的妙用
1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4902 Solved: 1879 题目连接 http:/ ...
- 记一次帮朋友解决apache站点403错误的过程
apache版本: [root@iZ25eby2utyZ web]# rpm -qa | grep httpd httpd-tools--.el6.centos..x86_64 httpd--.el6 ...
- PostgreSQL教程收集(中文文档/命令行工具/常用命令)
http://www.postgres.cn/docs/9.6/index.html(中文文档) https://www.postgresql.org/docs/10/static/auth-meth ...
- java对mongodb的and, in, or 经常使用操作
DBCollection dbcon = null; DBObject query = new BasicDBObject(); BasicDBList values = new BasicDBLis ...