先看一段例程:

//-------------------------------
// 用于创建目录
//-------------------------------
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并不能保证程序串行执行,回调是回避不了的坑的更多相关文章

  1. NodeJs使用async让代码按顺序串行执行

    描述 由于nodejs中的函数调用都是异步执行的,而笔者在工程开发中函数A需要四五个参数,而这四五个参数值都是通过函数调用获得,因此按顺序写代码时,执行到函数A时,往往函数A需要的参数值因为参数的异步 ...

  2. vue使用技巧:Promise + async + await 解决组件间串行编程问题

    业务场景描述 大家都通过互联网投递过简历,比如在智联.58.猎聘等平台.投递心仪的职位前一般都需要前提创建一份简历,简历编辑界面常规的布局最上面是用户的个人基本信息,如姓名.性别.年龄.名族等,接着是 ...

  3. 【Nodejs】使用nimble串行化回调任务

    nodejs的nimble模块可以使我们对回调任务进行串行化,它需要先安装 #npm install nimble 用法也方便,示例代码如下: //========================== ...

  4. async/await实现图片的串行、并行加载

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. nodejs进阶(7)—async异步流程控制

    Async介绍 Async是一个流程控制工具包,提供了直接而强大的异步功能.基于Javascript为Node.js设计,同时也可以直接在浏览器中使用. Async提供了大约20个函数,包括常用的 m ...

  6. 进程与程序 并行 并发 串行 阻塞 join函数

    进程是正在运行的程序,程序是程序员编写的一对代码,也就是一堆字符,当这堆代码被系统加载到内存并执行,就有了进程. (需要注意的是:一个程序是可以产生多个程序,就像我们可以同时运行多个QQ程序一样,会形 ...

  7. async/await 里的并行和串行

    我们在使用 async/await 语法时,有时会这样用: function getName () { return new Promise((resolve, reject)=>{ setTi ...

  8. nodejs异步调用async

    犹豫nodejs是异步编程模型,有一些在同步编程中很容易做到的事情,现在却变得很麻烦,async的流程控制就是为了简化这些操作var async = require('async'); 1.serie ...

  9. java 保证程序安全退出

    以前在开发时只知道依靠数据库事务来保证程序关闭时数据的完整性. 但有些时候一个业务上要求的原子操作,不一定只包括数据库,比如外部接口或者消息队列.此时数据库事务就无能为力了. 这时我们可以依靠java ...

随机推荐

  1. [BZOJ4487][JSOI2015]染色问题(容斥)

    一开始写了7个DP方程,然后意识到这种DP应该都会有一个通式. 三个条件:有色行数为n,有色列数为m,颜色数p,三维容斥原理仍然成立. 于是就是求:$\sum_{i=0}^{n}\sum_{j=0}^ ...

  2. 一个完成的spring xml配置文件

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  3. Caffe2(1)----Ubantu14.04安装

    英文好的请直接参考官方安装文档:Ubantu14.04下的源码编译. Caffe2的安装相比以前Caffe一代的安装,简直有点一键装机的感觉,下面简单总结下Caffe2的安装. 环境:Ubantu14 ...

  4. 了解 WMI (Windows Management Instrumentation) Windows管理工具

    它的功能主要是:访问本地主机的一些信息和服务,可以管理远程计算机(当然你必须要拥有足够的权限),比如:重启,关机,关闭进程,创建进程等

  5. ecshop功能目录

    右上 开店向导 1设置商店的一些基本信息 商店的名字.地址.配送方式.支付方式等 2给商店添加一些商品 商品的名称.数量.分类.品牌.价格.描述等 3恭喜您,您的网店可以使用了!下面是一些常用功能的链 ...

  6. ThinkPHP 数据库操作之数据表模型和基础模型 ( Model )

    一.定义数据表模型 1.模型映射 要测试数据库是否正常连接,最直接的办法就是在当前控制器中实例化数据表,然后使用 dump 函数输出,查看数据库的链接状态.代码: public function te ...

  7. 如何从Windows远程上传文件到Linux(例如CentOS 7)

    一.先看Linux系统是否安装有vsftp软件(vs是very secure的意思) [root@localhost /]# rpm -qa | grep vsftpdvsftpd-3.0.2-9.e ...

  8. sqlserver存储过程循环写法

    用游标,和WHILE可以遍历您的查询中的每一条记录并将要求的字段传给变量进行相应的处理==================DECLARE @A1 VARCHAR(10),@A2 VARCHAR(10) ...

  9. transform,transition,animation 的混合使用——进阶

    今天我们来讲述css3能够做成动画的最小独立单元,并且讲述如何使用这些独立的单元来构成一个‘高大尚’的组合动画. 这是我在网上找的一个案例,修改后的效果图,虽说不是特别的‘高大尚’,但我认为这也跟高大 ...

  10. QDAC

    QDAC GITHUB: svn://www.qdac.cc/QDAC3 包括QMsgPack\QJson\QWoker...等序列和事件调度控件.