【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 ...
随机推荐
- [HNOI2011]数学作业 --- 矩阵优化
[HNOI2011]数学作业 题目描述: 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N 和 M ,要求计算\(Concatenate(1..N)\; Mod\; ...
- [BZOJ4592][SHOI2015]脑洞治疗仪(线段树)
线段树基础操作题,唯一需要思考下的是将区间的前k个0覆盖为1. 线段树上二分,先递归到左子树覆盖,回溯时返回还剩多少个0未被覆盖,在根据这个信息递归到右子树.注意特判k=0的情况. 要维护的信息有:区 ...
- Questions(Updating)
有时候做题时会遇到一些未学习的零碎知识点,或存疑的疑惑 为防止遗忘,在此记录 1.复数除法与线性变换的关系 Accepted Codeforces 8D(2018.5.9) Definition: 复 ...
- Codeforces Round #281 (Div. 2) D. Vasya and Chess 镜面对称 博弈论
D. Vasya and Chess time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- C#高级编程9-第4章 继承
继承是面向对象的一大特征.要深刻学习继承,需要学会使用调试的技巧来学习它,因为它比较抽象. 继承 继承是指一个具体的类型直接使用另一类型的某些数据成员或函数成员,继承的类是基类(父类),被继承的类是派 ...
- GIT(2)----入门资料,分支管理,冲突解决
最近一直使用者GIT发现使用起来确实很不错,最近做些整理总结,发现了一些很不错的资料,收集在这里,以备忘. GIT入门挺简单的,之前有些过一篇文章,关于GIT的,但是都是一些生硬的操作,并没有系统的学 ...
- Tomcat启动异常 java.net.BindException: Cannot assign requested address: JVM_Bind
从Apache官网下载的tomcat7,在MyEclipse中启动时抛出如下异常: 严重: StandardServer.await: create[localhost:8005]: java.net ...
- 重温PHP之选择排序
思路:一组数中,选出最小者与第一个位置数交换,然后在剩余数中再找最小者与第二个位置数交换,依次类推,循环到倒数第二个数和最后一个数比较为止. 测试代码: 结果:
- SPOJ 375. Query on a tree (动态树)
375. Query on a tree Problem code: QTREE You are given a tree (an acyclic undirected connected graph ...
- ConcurrentHashMap JDK 1.6 源码分析
前言 前段时间把 JDK 1.6 中的 HashMap 主要的一些操作源码分析了一次.既然把 HashMap 源码分析了, 就顺便把 JDK 1.6 中 ConcurrentHashMap 的主要一些 ...