亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Nodejs異步流程框架async的方法

 更新時(shí)間:2019年06月07日 10:16:32   作者:websun  
這篇文章主要介紹了Nodejs異步流程框架async的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

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

我們常用的是以下四種:

  • 串行無關(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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 為什么Node.js會(huì)這么火呢?Node.js流行的原因

    為什么Node.js會(huì)這么火呢?Node.js流行的原因

    是什么原因讓Node.js突然間如此流行呢?聽起來像是有了一種新的Web開發(fā)技術(shù),是這樣嗎?我們來匯總一下。
    2014-12-12
  • nodejs插件及用法整理

    nodejs插件及用法整理

    在本篇文章里小編給大家整理的是一篇關(guān)于nodejs插件及用法相關(guān)內(nèi)容,有興趣的朋友們可以跟著學(xué)習(xí)參考下。
    2021-11-11
  • 淺析Node.js查找字符串功能

    淺析Node.js查找字符串功能

    今天做項(xiàng)目的時(shí)候需要的一個(gè)問題,想查找一個(gè)字符串,但是忘記了,具體在那個(gè)文件里了,于是就想起來了node.js,毫無壓力的找到了這個(gè)字符串,分享給大家
    2014-09-09
  • nvm使用use命令失效問題解決方法

    nvm使用use命令失效問題解決方法

    這篇文章主要給大家介紹了關(guān)于nvm使用use命令失效問題的解決方法,nvm是一個(gè)類似于版本管理工具的軟件,它可以輕松地在同一臺(tái)計(jì)算機(jī)上管理多個(gè)不同的node.js版本,需要的朋友可以參考下
    2023-07-07
  • Node.js靜態(tài)文件服務(wù)器改進(jìn)版

    Node.js靜態(tài)文件服務(wù)器改進(jìn)版

    這篇文章主要介紹了Node.js靜態(tài)文件服務(wù)器改進(jìn)版的相關(guān)資料,需要的朋友可以參考下
    2016-01-01
  • 一文教你如何使用Node進(jìn)程管理工具-pm2

    一文教你如何使用Node進(jìn)程管理工具-pm2

    這篇文章詳細(xì)介紹了如何使用node進(jìn)程管理工具pm2,文中代碼示例講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以借鑒一下
    2023-04-04
  • Nodejs實(shí)現(xiàn)多房間簡(jiǎn)易聊天室功能

    Nodejs實(shí)現(xiàn)多房間簡(jiǎn)易聊天室功能

    本文通過實(shí)例代碼給大家介紹了Nodejs實(shí)現(xiàn)多房間簡(jiǎn)易聊天室功能,需要的朋友參考下吧
    2017-06-06
  • Node.js 中的 fs 模塊與Path模塊方法詳解

    Node.js 中的 fs 模塊與Path模塊方法詳解

    這篇文章主要介紹了Node.js 中的 fs 模塊與Path模塊,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • 基于nodejs的微信JS-SDK簡(jiǎn)單應(yīng)用實(shí)現(xiàn)

    基于nodejs的微信JS-SDK簡(jiǎn)單應(yīng)用實(shí)現(xiàn)

    這篇文章主要介紹了基于nodejs的微信JS-SDK簡(jiǎn)單應(yīng)用實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-05-05
  • NodeJS有難度的面試題(能答對(duì)幾個(gè))

    NodeJS有難度的面試題(能答對(duì)幾個(gè))

    這篇文章主要介紹了NodeJS有難度的面試題(能答對(duì)幾個(gè)),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10

最新評(píng)論