Nodejs異步流程框架async的方法
Async的簡單介紹:
Async是一個流程控制工具包,提供了直接而強大的異步功能。基于Javascript為Node.js設計,同時也可以直接在瀏覽器中使用。Async提供了大約20個函數(shù),包括常用的map, reduce, filter, forEach等,異步流程控制模式包括,串行(series),并行(parallel),瀑布(waterfall)等。
https://github.com/caolan/async
我們常用的是以下四種:
- 串行無關聯(lián)
- 串行有關聯(lián)
- 并行無關聯(lián)
- 智能控制
1.async.series:串行無關聯(lián):
多個函數(shù)或方法要依次執(zhí)行,但是他們之間并沒有什么聯(lián)系,只有先后的順序,比如我要寫一個文件,寫完之后像用戶發(fā)送郵件,這兩者之間沒有必然的聯(lián)系,但是發(fā)郵件必須在寫文件完成之后。
async里有一個方法series可以實現(xiàn)這一流程,代碼實現(xiàn)如下:
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:串行有關聯(lián)
瀑布流函數(shù),串行執(zhí)行數(shù)組中的每一個函數(shù)最后執(zhí)行回調。 語法:async.waterfall(tasks,callback) 第一個參數(shù)tasks是一個數(shù)組,數(shù)組包含的是需要依次執(zhí)行的函數(shù)。
第二個參數(shù)為回調函數(shù),當瀑布流函數(shù)(即tasks數(shù)組中的函數(shù))執(zhí)行出現(xiàn)錯誤時會執(zhí)行這個回調函數(shù)并將錯誤信息返回,當瀑布流函數(shù)無錯誤時,會在執(zhí)行完tasks數(shù)組中包含的函數(shù)后執(zhí)行這個回調函數(shù)。
用法示例: 一般用法:
async.waterfall([
myFirstFun,
mySecondFun,
myLastFun
],function(err,result) { // result回調函數(shù)
// result 相當于tasks數(shù)組中最后一個函數(shù)(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:并行無關聯(lián)
task并行運行函數(shù)集合,而不必等到上一個函數(shù)完成。如果任何函數(shù)發(fā)生錯誤,會立刻執(zhí)行回調函數(shù),并返回錯誤信息;若沒有發(fā)生錯誤,則會再所有tasks函數(shù)執(zhí)行完畢之后用回掉函數(shù)將結果返回。
語法: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可以解決這一問題。
如下場景:
- 從某處取得數(shù)據(jù)
- 在硬盤上建立一個新的目錄
- 將數(shù)據(jù)寫入到目錄下某文件
- 發(fā)送郵件,將文件以附件形式發(fā)送給其它人。
- 可以知道1與2可以并行執(zhí)行,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
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

