Nodejs異步流程框架async

  • Async的簡單介紹:

Async是一個流程控制工具包,提供了直接而強大的異步功能。基於Javascript爲Node.js設計,同時也能夠直接在瀏覽器中使用。Async提供了大約20個函數,包括經常使用的
map, reduce, filter, forEach等,異步流程控制模式包括,串行(series),並行(parallel),瀑布(waterfall)等。
https://github.com/caolan/asyncgit

  • 咱們經常使用的是如下四種:

串行無關聯
串行有關聯
並行無關聯
智能控制github

  • 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
相關文章
相關標籤/搜索