国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > JS > 正文

Nodejs異步流程框架async的方法

2024-05-06 16:51:56
字體:
供稿:網(wǎng)友

Async的簡(jiǎn)單介紹:

Async是一個(gè)流程控制工具包,提供了直接而強(qiáng)大的異步功能。基于Javascript為Node.js設(shè)計(jì),同時(shí)也可以直接在瀏覽器中使用。Async提供了大約20個(gè)函數(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):

多個(gè)函數(shù)或方法要依次執(zhí)行,但是他們之間并沒有什么聯(lián)系,只有先后的順序,比如我要寫一個(gè)文件,寫完之后像用戶發(fā)送郵件,這兩者之間沒有必然的聯(lián)系,但是發(fā)郵件必須在寫文件完成之后。
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)。 語法: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ù)無錯(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:并行無關(guān)聯(lián)

task并行運(yùn)行函數(shù)集合,而不必等到上一個(gè)函數(shù)完成。如果任何函數(shù)發(fā)生錯(cuò)誤,會(huì)立刻執(zhí)行回調(diào)函數(shù),并返回錯(cuò)誤信息;若沒有發(fā)生錯(cuò)誤,則會(huì)再所有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)一個(gè)場(chǎng)景里,需要使用串行也需要使用并行的時(shí)候,雖然分別寫能解決,但是效率不是很高,維護(hù)性也不是很好,auto可以解決這一問題。

如下場(chǎng)景:

  • 從某處取得數(shù)據(jù)
  • 在硬盤上建立一個(gè)新的目錄
  • 將數(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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VeVb武林網(wǎng)。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到JavaScript/Ajax教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 砀山县| 横峰县| 金阳县| 乌海市| 高陵县| 岳普湖县| 双流县| 康乐县| 东乌珠穆沁旗| 永川市| 法库县| 湛江市| 乌鲁木齐市| 保靖县| 宁南县| 临夏市| 无极县| 克东县| 措勤县| 大同市| 冷水江市| 莱州市| 子洲县| 临猗县| 徐闻县| 蒙城县| 长宁县| 南靖县| 南康市| 晋中市| 伊春市| 靖西县| 集安市| 新绛县| 广丰县| 葫芦岛市| 台江县| 华坪县| 江口县| 阳东县| 武义县|