摘要:如果任何函數(shù)發(fā)生錯誤,會立刻執(zhí)行回調(diào)函數(shù),并返回錯誤信息若沒有發(fā)生錯誤,則會再所有函數(shù)執(zhí)行完畢之后用回掉函數(shù)將結(jié)果返回。
Async的簡單介紹:
Async是一個流程控制工具包,提供了直接而強大的異步功能?;贘avascript為Node.js設(shè)計,同時也可以直接在瀏覽器中使用。Async提供了大約20個函數(shù),包括常用的
map, reduce, filter, forEach等,異步流程控制模式包括,串行(series),并行(parallel),瀑布(waterfall)等。
https://github.com/caolan/async
我們常用的是以下四種:
串行無關(guān)聯(lián)
串行有關(guān)聯(lián)
并行無關(guān)聯(lián)
智能控制
1.async.series:串行無關(guān)聯(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) { //最后結(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ù)組中的每一個函數(shù)最后執(zhí)行回調(diào)。 語法:async.waterfall(tasks,callback) 第一個參數(shù)tasks是一個數(shù)組,數(shù)組包含的是需要依次執(zhí)行的函數(shù)。
第二個參數(shù)為回調(diào)函數(shù),當(dāng)瀑布流函數(shù)(即tasks數(shù)組中的函數(shù))執(zhí)行出現(xiàn)錯誤時會執(zhí)行這個回調(diào)函數(shù)并將錯誤信息返回,當(dāng)瀑布流函數(shù)無錯誤時,會在執(zhí)行完tasks數(shù)組中包含的函數(shù)后執(zhí)行這個回調(diào)函數(shù)。
用法示例: 一般用法:
async.waterfall([ myFirstFun, mySecondFun, myLastFun ],function(err,result) { // result回調(diào)函數(shù) // result 相當(dāng)于tasks數(shù)組中最后一個函數(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:并行無關(guān)聯(lián) task并行運行函數(shù)集合,而不必等到上一個函數(shù)完成。如果任何函數(shù)發(fā)生錯誤,會立刻執(zhí)行回調(diào)函數(shù),并返回錯誤信息;若沒有發(fā)生錯誤,則會再所有tasks函數(shù)執(zhí)行完畢之后用回掉函數(shù)將結(jié)果返回。
語法: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)一個場景里,需要使用串行也需要使用并行的時候,雖然分別寫能解決,但是效率不是很高,維護性也不是很好,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"); }); 結(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
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/104488.html
摘要:簡介指的是兩個關(guān)鍵字,是引入的新標(biāo)準(zhǔn),關(guān)鍵字用于聲明函數(shù),關(guān)鍵字用來等待異步必須是操作,說白了就是的語法糖。最后希望大家在讀過異步發(fā)展流程這個系列之后,對異步已經(jīng)有了較深的認(rèn)識,并可以在不同情況下游刃有余的使用這些處理異步的編程手段。 showImg(https://segmentfault.com/img/remote/1460000018998406?w=1024&h=379); ...
摘要:從零開始系列文章,將介紹如何利做為服務(wù)端腳本,通過框架開發(fā)??蚣苁腔诘囊?,是目前速度最快的引擎。瀏覽器就基于,同時打開個網(wǎng)頁都很流暢。標(biāo)準(zhǔn)的開發(fā)框架,可以幫助我們迅速建立站點,比起的開發(fā)效率更高,而且學(xué)習(xí)曲線更低。 從零開始nodejs系列文章,將介紹如何利Javascript做為服務(wù)端腳本,通過Nodejs框架web開發(fā)。Nodejs框架是基于V8的引擎,是目前速度最快的Java...
摘要:調(diào)用方法執(zhí)行到后暫停,內(nèi)部環(huán)境被保存,執(zhí)行返回一個對象,為的執(zhí)行結(jié)果,表示迭代器是否完成。當(dāng)?shù)魍瓿珊?,為,為的值,繼續(xù)執(zhí)行,將為執(zhí)行原理回到開頭的例子,給我們提供了直觀的寫法來處理異步回調(diào),它讓代碼邏輯非常清晰。 編者按:看完本文,你能對ES6的Generator有一個很好的理解,輕松地以同步的方式寫異步代碼,也能初步理解到TJ大神的co框架的原理。 前言:ES6在2015年6月正...
摘要:中文資料導(dǎo)航官網(wǎng)七牛鏡像深入淺出系列進(jìn)階必讀中文文檔被誤解的編寫實戰(zhàn)系列熱門模塊排行榜,方便找出你想要的模塊多線程,真正的非阻塞淺析的類利用編寫異步多線程的實例中與的區(qū)別管道拒絕服務(wù)漏洞高級編程業(yè)界新聞看如何評價他們的首次嘗鮮程序員如何說服 node.js中文資料導(dǎo)航 Node.js HomePage Node官網(wǎng)七牛鏡像 Infoq深入淺出Node.js系列(進(jìn)階必讀) Nod...
Github上的腳手架實在太多,可能大多數(shù)都是只專注在前端的web開發(fā),例如流行的React生態(tài)中的create-react-app和Vue生態(tài)中的Vue-cli, 但是可能作為像我一樣的全棧開發(fā),一個只關(guān)注在前端開發(fā)的腳手架滿足不了所有的需求,我們可能需要開發(fā)更復(fù)雜的全棧JS的項目,所以這里介紹又一個基于NodeJS的全棧開發(fā)框架 koa-web-kit,不一定適合所有人,但至少又多了個選擇?。...
閱讀 2056·2021-09-07 10:24
閱讀 2114·2019-08-30 15:55
閱讀 2070·2019-08-30 15:43
閱讀 695·2019-08-29 15:25
閱讀 1097·2019-08-29 12:19
閱讀 1964·2019-08-23 18:32
閱讀 1553·2019-08-23 17:59
閱讀 971·2019-08-23 12:22