摘要:如果任何函數(shù)發(fā)生錯(cuò)誤,會(huì)立刻執(zhí)行回調(diào)函數(shù),并返回錯(cuò)誤信息若沒(méi)有發(fā)生錯(cuò)誤,則會(huì)再所有函數(shù)執(zhí)行完畢之后用回掉函數(shù)將結(jié)果返回。
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í)行,但是他們之間并沒(méi)有什么聯(lián)系,只有先后的順序,比如我要寫(xiě)一個(gè)文件,寫(xiě)完之后像用戶(hù)發(fā)送郵件,這兩者之間沒(méi)有必然的聯(lián)系,但是發(fā)郵件必須在寫(xiě)文件完成之后。
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ò)誤信息;若沒(méi)有發(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í)候,雖然分別寫(xiě)能解決,但是效率不是很高,維護(hù)性也不是很好,auto可以解決這一問(wèn)題。
如下場(chǎng)景:
從某處取得數(shù)據(jù)
在硬盤(pán)上建立一個(gè)新的目錄
將數(shù)據(jù)寫(xiě)入到目錄下某文件
發(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
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/104488.html
摘要:簡(jiǎn)介指的是兩個(gè)關(guān)鍵字,是引入的新標(biāo)準(zhǔn),關(guān)鍵字用于聲明函數(shù),關(guān)鍵字用來(lái)等待異步必須是操作,說(shuō)白了就是的語(yǔ)法糖。最后希望大家在讀過(guò)異步發(fā)展流程這個(gè)系列之后,對(duì)異步已經(jīng)有了較深的認(rèn)識(shí),并可以在不同情況下游刃有余的使用這些處理異步的編程手段。 showImg(https://segmentfault.com/img/remote/1460000018998406?w=1024&h=379); ...
摘要:從零開(kāi)始系列文章,將介紹如何利做為服務(wù)端腳本,通過(guò)框架開(kāi)發(fā)??蚣苁腔诘囊妫悄壳八俣茸羁斓囊?。瀏覽器就基于,同時(shí)打開(kāi)個(gè)網(wǎng)頁(yè)都很流暢。標(biāo)準(zhǔn)的開(kāi)發(fā)框架,可以幫助我們迅速建立站點(diǎn),比起的開(kāi)發(fā)效率更高,而且學(xué)習(xí)曲線(xiàn)更低。 從零開(kāi)始nodejs系列文章,將介紹如何利Javascript做為服務(wù)端腳本,通過(guò)Nodejs框架web開(kāi)發(fā)。Nodejs框架是基于V8的引擎,是目前速度最快的Java...
摘要:調(diào)用方法執(zhí)行到后暫停,內(nèi)部環(huán)境被保存,執(zhí)行返回一個(gè)對(duì)象,為的執(zhí)行結(jié)果,表示迭代器是否完成。當(dāng)?shù)魍瓿珊?,為,為的值,繼續(xù)執(zhí)行,將為執(zhí)行原理回到開(kāi)頭的例子,給我們提供了直觀的寫(xiě)法來(lái)處理異步回調(diào),它讓代碼邏輯非常清晰。 編者按:看完本文,你能對(duì)ES6的Generator有一個(gè)很好的理解,輕松地以同步的方式寫(xiě)異步代碼,也能初步理解到TJ大神的co框架的原理。 前言:ES6在2015年6月正...
摘要:中文資料導(dǎo)航官網(wǎng)七牛鏡像深入淺出系列進(jìn)階必讀中文文檔被誤解的編寫(xiě)實(shí)戰(zhàn)系列熱門(mén)模塊排行榜,方便找出你想要的模塊多線(xiàn)程,真正的非阻塞淺析的類(lèi)利用編寫(xiě)異步多線(xiàn)程的實(shí)例中與的區(qū)別管道拒絕服務(wù)漏洞高級(jí)編程業(yè)界新聞看如何評(píng)價(jià)他們的首次嘗鮮程序員如何說(shuō)服 node.js中文資料導(dǎo)航 Node.js HomePage Node官網(wǎng)七牛鏡像 Infoq深入淺出Node.js系列(進(jìn)階必讀) Nod...
Github上的腳手架實(shí)在太多,可能大多數(shù)都是只專(zhuān)注在前端的web開(kāi)發(fā),例如流行的React生態(tài)中的create-react-app和Vue生態(tài)中的Vue-cli, 但是可能作為像我一樣的全棧開(kāi)發(fā),一個(gè)只關(guān)注在前端開(kāi)發(fā)的腳手架滿(mǎn)足不了所有的需求,我們可能需要開(kāi)發(fā)更復(fù)雜的全棧JS的項(xiàng)目,所以這里介紹又一個(gè)基于NodeJS的全棧開(kāi)發(fā)框架 koa-web-kit,不一定適合所有人,但至少又多了個(gè)選擇?。...
閱讀 2236·2021-09-07 10:24
閱讀 2198·2019-08-30 15:55
閱讀 2202·2019-08-30 15:43
閱讀 763·2019-08-29 15:25
閱讀 1189·2019-08-29 12:19
閱讀 2025·2019-08-23 18:32
閱讀 1632·2019-08-23 17:59
閱讀 1042·2019-08-23 12:22