Nodejs異步流程框架async的方法
Async的簡(jiǎn)單介紹:
Async是一個(gè)流程控制工具包,提供了直接而強(qiáng)大的異步功能?;贘avascript為Node.js設(shè)計(jì),同時(shí)也可以直接在瀏覽器中使用。Async提供了大約20個(gè)函數(shù),包括常用的map, reduce, filter, forEach等,異步流程控制模式包括,串行(series),并行(parallel),瀑布(waterfall)等。
https://github.com/caolan/async
我們常用的是以下四種:
- 串行無(wú)關(guān)聯(lián)
- 串行有關(guān)聯(lián)
- 并行無(wú)關(guān)聯(lián)
- 智能控制
1.async.series:串行無(wú)關(guān)聯(lián):
多個(gè)函數(shù)或方法要依次執(zhí)行,但是他們之間并沒有什么聯(lián)系,只有先后的順序,比如我要寫一個(gè)文件,寫完之后像用戶發(fā)送郵件,這兩者之間沒有必然的聯(lián)系,但是發(fā)郵件必須在寫文件完成之后。
async里有一個(gè)方法series可以實(shí)現(xiàn)這一流程,代碼實(shí)現(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) {
//最后結(jié)果
console.log('error: ' + error);
console.log('result: ' + result);
console.timeEnd('series');
});
// error: null
// result: [object Object]
// series: 4.472ms
2.async.waterfall:串行有關(guān)聯(lián)
瀑布流函數(shù),串行執(zhí)行數(shù)組中的每一個(gè)函數(shù)最后執(zhí)行回調(diào)。 語(yǔ)法:async.waterfall(tasks,callback) 第一個(gè)參數(shù)tasks是一個(gè)數(shù)組,數(shù)組包含的是需要依次執(zhí)行的函數(shù)。
第二個(gè)參數(shù)為回調(diào)函數(shù),當(dāng)瀑布流函數(shù)(即tasks數(shù)組中的函數(shù))執(zhí)行出現(xiàn)錯(cuò)誤時(shí)會(huì)執(zhí)行這個(gè)回調(diào)函數(shù)并將錯(cuò)誤信息返回,當(dāng)瀑布流函數(shù)無(wú)錯(cuò)誤時(shí),會(huì)在執(zhí)行完tasks數(shù)組中包含的函數(shù)后執(zhí)行這個(gè)回調(diào)函數(shù)。
用法示例: 一般用法:
async.waterfall([
myFirstFun,
mySecondFun,
myLastFun
],function(err,result) { // result回調(diào)函數(shù)
// result 相當(dāng)于tasks數(shù)組中最后一個(gè)函數(shù)(myLastFun)的返回值done
console.log(result); // myLastFun
})
function myFirstFun(callback) {
callback(null,'one','two');
}
function mySecondFun(arg1,arg2,callback) {
// arg1 相當(dāng)于 'one' ,arg2 相當(dāng)于 'two'
callback(null,'three');
}
function myLastFun(arg1,callback) {
// arg1 相當(dāng)于 'three'
callback(null,'done');
}
3.async.parallel:并行無(wú)關(guān)聯(lián)
task并行運(yùn)行函數(shù)集合,而不必等到上一個(gè)函數(shù)完成。如果任何函數(shù)發(fā)生錯(cuò)誤,會(huì)立刻執(zhí)行回調(diào)函數(shù),并返回錯(cuò)誤信息;若沒有發(fā)生錯(cuò)誤,則會(huì)再所有tasks函數(shù)執(zhí)行完畢之后用回掉函數(shù)將結(jié)果返回。
語(yǔ)法: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:智能控制
以上都是純串行傳并行,但是當(dāng)一個(gè)場(chǎng)景里,需要使用串行也需要使用并行的時(shí)候,雖然分別寫能解決,但是效率不是很高,維護(hù)性也不是很好,auto可以解決這一問題。
如下場(chǎng)景:
- 從某處取得數(shù)據(jù)
- 在硬盤上建立一個(gè)新的目錄
- 將數(shù)據(jù)寫入到目錄下某文件
- 發(fā)送郵件,將文件以附件形式發(fā)送給其它人。
- 可以知道1與2可以并行執(zhí)行,3需要等1和2完成,4要等3完成。
- 使用auto來(lái)解決
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');
});
結(jié)果如下
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
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Egret引擎開發(fā)指南之運(yùn)行項(xiàng)目
Egret Framework是一款使用TypeScript語(yǔ)言構(gòu)建的開源免費(fèi)的移動(dòng)游戲框架。Egret Framework的核心定位是開放,高效,優(yōu)雅。通過它,你可以快速地創(chuàng)建HTML5類型的移動(dòng)游戲,也可以將游戲項(xiàng)目編譯輸出成為目標(biāo)移動(dòng)平臺(tái)的原生游戲應(yīng)用。2014-09-09
Node.js配合node-http-proxy解決本地開發(fā)ajax跨域問題
這篇文章主要介紹了Node.js配合node-http-proxy解決本地開發(fā)ajax跨域問題,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08
Express 框架中使用 EJS 模板引擎并結(jié)合 silly-datetime
這篇文章主要介紹了Express 框架中使用 EJS 模板引擎并結(jié)合 silly-datetime 庫(kù)進(jìn)行日期格式化的實(shí)現(xiàn)方法,結(jié)合具體實(shí)例形式分析了express框架引入EJS模版以及導(dǎo)入 silly-datetime 庫(kù)的格式化方法傳遞給EJS模版使用的相關(guān)操作技巧,需要的朋友可以參考下2023-05-05
使用nodejs實(shí)現(xiàn)JSON文件自動(dòng)轉(zhuǎn)Excel的工具(推薦)
這篇文章主要介紹了使用nodejs實(shí)現(xiàn),JSON文件自動(dòng)轉(zhuǎn)Excel的工具,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
關(guān)于Node.js的events.EventEmitter用法介紹
本篇文章主要介紹了關(guān)于Node.js的events.EventEmitter用法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-04-04
Sequelize中用group by進(jìn)行分組聚合查詢
大家都知道在SQL查詢中,分組查詢是較常用的一種查詢方式。分組查詢是指通過GROUP BY關(guān)鍵字,將查詢結(jié)果按照一個(gè)或多個(gè)字段進(jìn)行分組,分組時(shí)字段值相同的會(huì)被分為一組。在Node.js基于Sequelize的ORM框架中,同樣支持分組查詢,使用非常簡(jiǎn)單方便。下面來(lái)看看詳細(xì)的介紹。2016-12-12
搭建一個(gè)Koa后端項(xiàng)目腳手架的方法步驟
這篇文章主要介紹了搭建一個(gè)Koa后端項(xiàng)目腳手架的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
使用Node實(shí)現(xiàn)Git倉(cāng)庫(kù)批量克隆的操作步驟
分享一個(gè)node腳本,通過調(diào)用gitee的OpenApi獲取自己的代碼倉(cāng)庫(kù)列表,達(dá)到批量克隆項(xiàng)目的效果,文中通過代碼示例和圖文講解的非常詳細(xì),感興趣的小伙伴可以參考閱讀一下2024-04-04

