Nodejs异步流程框架async

  • 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
    原文作者:wangy
    原文地址: https://segmentfault.com/a/1190000019408337
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞