nodejs 异步编程 async

在读源码的过程中,看到有关 async 的代码有很多,本来是问老师,想逃避这里。然而给老师给了一个思路,让理解 async 的 series 函数、waterfall 函数、以及 parallel 函数。于是就有了这篇文章。

async 适用的业务逻辑:连续对数据库操作,前后有依赖

1. 什么是异步编程

异步编程是指由于异步 I/O 等因素,无法同步获得执行结果时,在回调函数中进行下一步操作的代码编写风格,常见的eg: setTimeout 函数、ajax 请求等。

例:

for (var i = 1; i <= 3; i++) {
        setTimeout(function(){
            console.log(i);
        }, 0);
};

对于上述代码,可能大部分人会认为输出 123 或者 333。但正确结果是444

以上就是我们要说的异步编程。

在 javaScript 中,异步编程 的基础就是高阶函数。所谓高阶函数,其实就是把函数作为参数或者作为返回值。

例(将函数作为返回值):

function test(v){
      return function(){
        return v;
      }
}

2. 流程控制

与流程控制有关的函数有很多,在此,我只简要说说 series、waterfall、parallel。

  • series —— 串行执行,即按顺序一次执行
async.series({
    one: function(callback){
        callback(null, 1);
    },
    two: function(callback){
        callback(null, 2);
    }
},function(err, results) {
    console.log(results);
});

输出:{one: 1, two: 2}

series 函数的第一个参数可以是一个数组,也可是一个 JSON 对象,参数类型不同,影响的是返回数据的格式。

  • waterfall ——瀑布流

waterfall 和 series 有很多相似之处,都是按顺序执行。不同之处在于waterfall 每个函数产生的值,都将传给下一个函数,而 series 则没有这个功能

async.waterfall([
    function(callback){
        callback(null, 'one', 'two');
    },
    function(arg1, arg2, callback){
      // arg1 now equals 'one' and arg2 now equals 'two'
        callback(null, 'three');
    },
    function(arg1, callback){
        // arg1 now equals 'three'
        callback(null, 'done');
    }
], function (err, result) {
   // result now equals 'done'
   console.log(result);
});

*waterfall 的第一个参数只能是数组类型。当中途有函数出错,其 err 将直接传给最终 callback,结果被丢弃,后面函数不再执行。


  • parallel(tasks, [callback])

并行执行多个函数,每个函数都是立即执行,不需要等待其他函数先执行。传给最终 callback 的数组中的数据按照 tasks 中声明的顺序,而不是执行完成的顺序
例:

async.parallel([
    function(callback){
        callback(null, 'one');
    },
    function(callback){
        callback(null, 'two');
    }
],
function(err, results){

});

tasks 参数可以是一个数组或 JSON 对象,和 series 函数一样,tasks 参数类型不同,返回的results 格式会不一样

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值