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