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可以解決這一問題。
如下場景:
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
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。
新聞熱點
疑難解答