成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Nodejs異步流程框架async

miya / 1552人閱讀

摘要:如果任何函數(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)文章

  • 異步發(fā)展流程 —— 異步編程的終極大招 async/await

    摘要:簡介指的是兩個關(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); ...

    zhangfaliang 評論0 收藏0
  • 從零開始nodejs系列文章

    摘要:從零開始系列文章,將介紹如何利做為服務(wù)端腳本,通過框架開發(fā)??蚣苁腔诘囊?,是目前速度最快的引擎。瀏覽器就基于,同時打開個網(wǎng)頁都很流暢。標(biāo)準(zhǔn)的開發(fā)框架,可以幫助我們迅速建立站點,比起的開發(fā)效率更高,而且學(xué)習(xí)曲線更低。 從零開始nodejs系列文章,將介紹如何利Javascript做為服務(wù)端腳本,通過Nodejs框架web開發(fā)。Nodejs框架是基于V8的引擎,是目前速度最快的Java...

    rickchen 評論0 收藏0
  • Generator:同步代碼書寫異步情懷

    摘要:調(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月正...

    hightopo 評論0 收藏0
  • node.js中文資料導(dǎo)航

    摘要:中文資料導(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...

    geekidentity 評論0 收藏0
  • 下一代基于Koa的NodeJS全棧開發(fā)框架

    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,不一定適合所有人,但至少又多了個選擇?。...

    oliverhuang 評論0 收藏0

發(fā)表評論

0條評論

miya

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<