nodejs之async 模块

前言

针对JS的异步机制,JS社区给出了很多不同的解决方案,Async库便是其中一种,可能也是对于控制异步操作最全面的资源。因为该库提供了70个函数,几乎想所有的运用场景都考虑在内。

parallel

parallel 接受两个参数:

  • 第一个参数: 可以是数组或对象, 都可以,区别是输出格式。 多个函数是并行执行,没有前后顺序,不过所有函数执行完毕或者其中任一个返回err非空才会调用第二个参数。
  • 第二个参数: 是返回结果,参数,data里面保存上一个参数中多个函数返回的结果。如果任何一个函数返回err非空,会马上调用这个参数,不会等所有函数执行完。
'use strict';
var async = require('async');

console.time('x')

var first = function (cb) {
  console.log('i am first!');
  setTimeout(() => {
    cb(null, 10);
  }, 1000);
  
};

var second = function (cb) {
  console.log('i am second!');
  setTimeout(() => {
    cb(null, 2000);
  }, 2000);
  
};

var end = function (err, data) {
  console.log(`err:${err},data:${JSON.stringify(data)}`);
  console.timeEnd('x');
}


//async.parallel([first, second], end);  //输出: [10,2000]

async.parallel({"fir":first,"sec": second }, end);     //输出:{"fir":10,"sec":2000}

在这里插入图片描述

series

series 函数和 parallel函数类似,区别是series 第一个参数中的多个函数是并行执行,第一个执行完,才会执行第二个,所以用时会是多个函数运行时间之和,而parallel运行时间取决于最长的那个函数。

'use strict';

var async = require('async');
console.time('x')
var first = function (cb) {
  console.log('i am first!');
  setTimeout(() => {
    cb(null, 10);
  }, 1000);
  
};

var second = function (cb) {
  console.log('i am second!');
  setTimeout(() => {
    cb(null, 2000);
  }, 2000);
  
};

var end = function (err, data) {
  console.log(`err:${err},data:${JSON.stringify(data)}`);  
  console.timeEnd('x');
}

async.series([first, second], end);   // 输出:[10,2000]

//async.series({"fir":first,"sec": second }, end);  //输出:{"fir":10,"sec":2000}

在这里插入图片描述

watchfall

waterfall(tasks, [callback]) 

series函数并没有给出传递参数给下一个函数的功能,如果想并行执行同时把上一个函数callback结果传给下一个函数,需要用waterfall。

(多个函数依次执行,且前一个的输出为后一个的输入)按顺序依次执行多个函数。每一个函数产生的值,都将传给下一个函数。如果中途出错,后面的函数将不会被执行。错误信息以及之前产生的结果,将传给waterfall最终的callback。

对于学过了js回调机制的小伙伴,waterfall是比较容易理解的,个人的理解就是,waterfall中传入的函数数组tasks中,后一个函数为前一个函数的回调,使用cb(null,args),这样的形式调用下一个函数,如果出现异常,则直接使用cb(new Error(“错误的信息”))这样的方式来捕捉异常,并调用最终的回调函数来处理,在这种情况下,出现异常的函数后面那些函数,将不再继续执行,测试代码如下:

'use strict';

var async = require('async');

console.time('x')

var first = function (cb) {
  console.log('i am first!');
  setTimeout(() => {
    cb(null, 10);
  }, 1000);
  
};

var second = function (data,cb) {
  console.log('i am second!,data:',JSON.stringify(data));
  setTimeout(() => {
    cb(null, 2000);
  }, 2000);
  
};

var end = function (err, data) {
  console.log(`err:${err},data:${JSON.stringify(data)}`);  
  console.timeEnd('x');
}

async.waterfall([first, second], end);   //输出 2000


在这里插入图片描述

官方文档:
https://github.com/caolan/async/blob/v1.5.2/README.md#waterfall

map,mapLimit

map(coll, iteratee, callbackopt)
mapLimit(coll, limit, iteratee, callbackopt)

whilst(test, iteratee, callbackopt)

Repeatedly call iteratee, while test returns true. Calls callback when stopped, or an error occurs.

"use strict";

var async = require("async");

var index = 0;

var winChips = {
  "0": 100,
  "1": -100,
  "2": 3,
  "3": 4,
};

var keys = Object.keys(winChips);

async.whilst(
  function (cb) {
    cb(null, index < keys.length);
  },  // 如果第一个函数写成: function () {return index < keys.length;}, 下一个函数不会执行,什么都不执行,也不会报错
  function (cb) {
    console.log(`index:${index},chips:${ winChips[index++]}`);
    cb(null, index);
  },
  function (err, data) {
    console.log(`err:${err},data:${data}`);
  }
);

在这里插入图片描述

之前关于test部分的写法是:
function () { return count < 5; }, 这样写,导致后面iter函数并不会执行,直接跳过这个函数。在这个函数栽过跟头。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
fse是一个Node.js模块,用于处理文件系统操作。它提供了许多方法来执行文件和文件夹的创建、读取、写入、删除等操作。Node.js是一个基于Chrome V8引擎的JavaScript运行时环境,用于构建服务器端应用程序。它提供了许多内置模块和API,使开发者能够进行各种操作,包括文件系统操作。 在Node.js中,可以使用fse模块来执行各种文件系统操作,例如创建文件夹、复制文件、移动文件、删除文件等。这些操作可以帮助开发人员轻松地管理文件系统。此外,Node.js还提供了其他有用的模块和功能,如http模块用于构建Web服务器,fs模块用于处理文件操作,以及path模块用于处理文件路径等。 Node.js还支持许多其他功能,如异步编程、事件驱动编程和模块化开发。Promise、Async和ES6是在JavaScript中用于处理异步操作的重要概念和技术。Promise是一种用于处理异步操作的对象,它可以表示一个操作的最终完成或失败,并可以通过链式调用来处理操作的结果。Async/await是一种基于Promise的语法糖,它使开发者能够以同步的方式编写异步代码,提高了代码的可读性和可维护性。ES6是ECMAScript 6的缩写,也称为ES2015,它是JavaScript的一种新版本,引入了许多新的语法和功能,如箭头函数、解构赋值、模板字面量等。这些新功能使开发者能够更高效地编写代码。 总之,fse是Node.js的一个模块,用于处理文件系统操作,而Node.js本身是一个基于Chrome V8引擎的JavaScript运行时环境。Promise、Async和ES6是JavaScript中用于处理异步操作的重要概念和技术。在Node.js中,可以使用fse模块来执行文件系统操作,并结合Promise、Async和ES6来处理异步操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值