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

首頁 > 編程 > JavaScript > 正文

Nodejs異步流程框架async的方法

2019-11-19 11:22:38
字體:
來源:轉載
供稿:網友

Async的簡單介紹:

Async是一個流程控制工具包,提供了直接而強大的異步功能?;贘avascript為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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 四子王旗| 韶关市| 邵阳市| 台中县| 清流县| 抚顺县| 浪卡子县| 佛山市| 湖口县| 新疆| 河北区| 东丰县| 上高县| 武城县| 东源县| 万源市| 张家川| 德惠市| 门头沟区| 区。| 皋兰县| 平乐县| 达拉特旗| 南溪县| 高平市| 巴塘县| 永清县| 景德镇市| 滦南县| 奉化市| 明光市| 逊克县| 山阳县| 河北区| 海原县| 尉犁县| 余姚市| 龙州县| 崇礼县| 大埔区| 镇雄县|