成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

Nodejs異步流程框架async

miya / 1631人閱讀

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

相關(guān)文章

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

    摘要:簡(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); ...

    zhangfaliang 評(píng)論0 收藏0
  • 從零開(kāi)始nodejs系列文章

    摘要:從零開(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...

    rickchen 評(píng)論0 收藏0
  • Generator:同步代碼書(shū)寫(xiě)異步情懷

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

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

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

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

    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è)選擇?。...

    oliverhuang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

miya

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<