【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 ...
随机推荐
- 属性通知之ObservableCollection
单个属性是如何去通知,在上一章已经介绍过了,那么集合如何做到属性通知呢?这里要介绍ObservableCollection<T>,字面意思就是用于观察的集合. msdn上给出的定义是:表示 ...
- wx小程序碎碎念
对button组件的例子中,js代码的一点理解 for (var i = 0; i < types.length; ++i) { (function(type) { // 循环构建目标函数 pa ...
- lor框架代码分析
属性 lor: version router route request response fn app create_app Router Route Request Response 属性 lor ...
- python开发_platform_获取操作系统详细信息工具
''' python中,platform模块给我们提供了很多方法去获取操作系统的信息 如: import platform platform.platform() #获取操作系统名称及版本号,'Win ...
- 传智播客PHP面试题宝典开放下载
上下卷面试题更新完毕,一部让菜鸟4k+入职的 面试题宝典 http://php.itcast.cn/news/20130806/11490333788.shtml php视频教程 下载 http:// ...
- 2008 SCI 影响因子(Impact Factor)
2008 SCI 影响因子(Impact Factor) Excel download 期刊名缩写 影响因子 ISSN号 CA-CANCER J CLIN 74.575 0007-9235 NEW E ...
- android中反射机制
本文介绍Android反射机制实现与原理,在介绍之前,要和Java进行比较,所以先看下Java中的反射相关知识: 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或 ...
- Shell下的通配符、特殊符号和文件描写叙述符
一:通配符 * 代表『 0 个到无穷多个』随意字符 演示样例:找出 /etc/ 底下以 cron 为开头的文件名称的文件 [root@instructor Desktop]# ls /etc/cron ...
- [翻译] FlatUIKit
FlatUIKit FlatUIKit is a collection of iOS components styled with the "Flat UI" aesthetic ...
- Android读取Excel文件
转:http://bigcat.easymorse.com/?p=1648 java可以读取Excel文件,android同样也行,效果如下: excel源文件: 读取日志如下: 首先需要引入jxl. ...