资讯专栏INFORMATION COLUMN

Nodejs异步流程框架async

miya / 1403人阅读

摘要:如果任何函数发生错误,会立刻执行回调函数,并返回错误信息若没有发生错误,则会再所有函数执行完毕之后用回掉函数将结果返回。

Async的简单介绍:

Async是一个流程控制工具包,提供了直接而强大的异步功能。基于Javascript为Node.js设计,同时也可以直接在浏览器中使用。Async提供了大约20个函数,包括常用的
map, reduce, filter, forEach等,异步流程控制模式包括,串行(series),并行(parallel),瀑布(waterfall)等。
https://github.com/caolan/async

我们常用的是以下四种:

串行无关联
串行有关联
并行无关联
智能控制

1.async.series:串行无关联:
多个函数或方法要依次执行,但是他们之间并没有什么联系,只有先后的顺序,比如我要写一个文件,写完之后像用户发送邮件,这两者之间没有必然的联系,但是发邮件必须在写文件完成之后。
async里有一个方法series可以实现这一流程,代码实现如下:

var async = require("async");
console.time("series");
async.series({
    one: function(callback) {
        callback(null, "one");//callback("i am err","one");异常处理
    },
    two: function(callback) {
        callback(null, "two");

    },
}, function(error, result) {
    //最后结果
    console.log("error: " + error);
    console.log("result: " + result);
    console.timeEnd("series");
});

//  error: null
//  result: [object Object]
//  series: 4.472ms

2.async.waterfall:串行有关联 瀑布流函数,串行执行数组中的每一个函数最后执行回调。 语法:async.waterfall(tasks,callback) 第一个参数tasks是一个数组,数组包含的是需要依次执行的函数。
第二个参数为回调函数,当瀑布流函数(即tasks数组中的函数)执行出现错误时会执行这个回调函数并将错误信息返回,当瀑布流函数无错误时,会在执行完tasks数组中包含的函数后执行这个回调函数。
用法示例: 一般用法:

async.waterfall([
    myFirstFun,
    mySecondFun,
    myLastFun
],function(err,result) {  // result回调函数
    //  result 相当于tasks数组中最后一个函数(myLastFun)的返回值done
    console.log(result);   //  myLastFun
})
function myFirstFun(callback) {
    callback(null,"one","two");
}
function mySecondFun(arg1,arg2,callback) {
    //  arg1 相当于 "one" ,arg2 相当于 "two"
    callback(null,"three");
}
function myLastFun(arg1,callback) {
    //  arg1 相当于 "three"
    callback(null,"done");
}

3.async.parallel:并行无关联 task并行运行函数集合,而不必等到上一个函数完成。如果任何函数发生错误,会立刻执行回调函数,并返回错误信息;若没有发生错误,则会再所有tasks函数执行完毕之后用回掉函数将结果返回。
语法:async.parallel(tasks,callback) 代码示例:

async.parallel([
    function(callback) {
        setTimeout(function() {
            callback(null, "one");
        }, 200);
    },
    function(callback) {
        setTimeout(function() {
            callback(null, "two");
        }, 100);
    }
],function(err, results) {
    console.log(result)}
);

4.async.auto:智能控制
以上都是纯串行传并行,但是当一个场景里,需要使用串行也需要使用并行的时候,虽然分别写能解决,但是效率不是很高,维护性也不是很好,auto可以解决这一问题。
如下场景:
从某处取得数据
在硬盘上建立一个新的目录
将数据写入到目录下某文件
发送邮件,将文件以附件形式发送给其它人。
可以知道1与2可以并行执行,3需要等1和2完成,4要等3完成。
使用auto来解决

var async = require("async");
console.time("auto");
async.auto({
    getData: function(callback) {
        setTimeout(function() {
            console.log("1.1: got data");
            callback(null, "mydata");
        }, 300);
    },
    makeFolder: function(callback) {
        setTimeout(function() {
            console.log("1.1: made folder");
            callback(null, "myfolder");
        }, 200);
    },
    writeFile: ["getData", "makeFolder", function(callback) {
        setTimeout(function() {
            console.log("1.1: wrote file");
            callback(null, "myfile");
        }, 300);
    }],
    emailFiles: ["writeFile", function(callback, results) {
        console.log("emailed file: ", results.writeFile);
        callback(null, results.writeFile);
    }]
}, function(err, results) {
    console.log("err: ", err);
    console.log("results: ", results);
    console.timeEnd("auto");
});

结果如下
1.1: made folder
1.1: got data
1.1: wrote file
emailed file:  myfile
err:  null
results:  { makeFolder: "myfolder",
  getData: "mydata",
  writeFile: "myfile",
  emailFiles: "myfile" 
}
auto: 650.972ms

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/104488.html

相关文章

  • 异步发展流程 —— 异步编程的终极大招 async/await

    摘要:简介指的是两个关键字,是引入的新标准,关键字用于声明函数,关键字用来等待异步必须是操作,说白了就是的语法糖。最后希望大家在读过异步发展流程这个系列之后,对异步已经有了较深的认识,并可以在不同情况下游刃有余的使用这些处理异步的编程手段。 showImg(https://segmentfault.com/img/remote/1460000018998406?w=1024&h=379); ...

    zhangfaliang 评论0 收藏0
  • 从零开始nodejs系列文章

    摘要:从零开始系列文章,将介绍如何利做为服务端脚本,通过框架开发。框架是基于的引擎,是目前速度最快的引擎。浏览器就基于,同时打开个网页都很流畅。标准的开发框架,可以帮助我们迅速建立站点,比起的开发效率更高,而且学习曲线更低。 从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发。Nodejs框架是基于V8的引擎,是目前速度最快的Java...

    rickchen 评论0 收藏0
  • Generator:同步代码书写异步情怀

    摘要:调用方法执行到后暂停,内部环境被保存,执行返回一个对象,为的执行结果,表示迭代器是否完成。当迭代器完成后,为,为的值,继续执行,将为执行原理回到开头的例子,给我们提供了直观的写法来处理异步回调,它让代码逻辑非常清晰。 编者按:看完本文,你能对ES6的Generator有一个很好的理解,轻松地以同步的方式写异步代码,也能初步理解到TJ大神的co框架的原理。 前言:ES6在2015年6月正...

    hightopo 评论0 收藏0
  • node.js中文资料导航

    摘要:中文资料导航官网七牛镜像深入浅出系列进阶必读中文文档被误解的编写实战系列热门模块排行榜,方便找出你想要的模块多线程,真正的非阻塞浅析的类利用编写异步多线程的实例中与的区别管道拒绝服务漏洞高级编程业界新闻看如何评价他们的首次尝鲜程序员如何说服 node.js中文资料导航 Node.js HomePage Node官网七牛镜像 Infoq深入浅出Node.js系列(进阶必读) Nod...

    geekidentity 评论0 收藏0
  • 下一代基于Koa的NodeJS全栈开发框架

    Github上的脚手架实在太多,可能大多数都是只专注在前端的web开发,例如流行的React生态中的create-react-app和Vue生态中的Vue-cli, 但是可能作为像我一样的全栈开发,一个只关注在前端开发的脚手架满足不了所有的需求,我们可能需要开发更复杂的全栈JS的项目,所以这里介绍又一个基于NodeJS的全栈开发框架 koa-web-kit,不一定适合所有人,但至少又多了个选择?。...

    oliverhuang 评论0 收藏0

发表评论

0条评论

miya

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<