async的常用 api

//text目录
1.txt
2.txt
//util.js
var fs = require('fs')
module.exports = {
    //异步返回读取的文件内容
    readFile (filePath, cb) {
        fs.readFile(filePath, 'utf-8', (err, data) => {
            cb(err, data)
        })
    }
}

一.流程控制类

  • series(串行控制,互不干扰,执行完一项在执行下一步,数据没关联)
var async = require('async')
var fs = require('fs')
var path = require('path')
var util = require('./util')
var test = require('./text/3.test.js')
async.series([
    function (cb) {
        setTimeout(() => {
            util.readFile(path.join(__dirname, 'text/1.txt'), cb)  //注入回调 cb
        }, 3000)
    },
    function (cb) {
        setTimeout(() => {
            util.readFile(path.join(__dirname, 'text/2.txt'), cb)
        },1000)
    }
], (err, data) => {
    console.log(err) //null
    console.log(data) //[ '‘这是第一个文件’', '\'这是第二个文件\'' ]
})
//[ '‘这是第一个文件’', '\'这是第二个文件\'' ]   总共花了4s 的时间得到结果

1.series 参数支持数组或者 Json格式相应的最终的回调函数里面的结果也相应的变成数组或者 Json.
2.series 串行, 执行完一个在执行下一个,所以最终函数的响应时间等于各个函数的执行时间之和.
3.某个函数 报错或者得到 err 对象,那么直接终止下面的函数运行,并且把错误对象传到最后的函数.


  • parallel(并行执行,所有函数同时进行,支持Json格式的函数,数据无关联)
//无错误的情况下
async.parallel([
    function (cb) {
        setTimeout(() => {
            util.readFile(path.join(__dirname, 'text/1.txt'), cb)
        }, 4000)
    },
    function (cb) {
        setTimeout(() => {
            util.readFile(path.join(__dirname, 'text/2.txt'), cb)
        },3000)
    }
], (err, data) => {
    console.log(err)
    console.log(data)
})
//[ '‘这是第一个文件’', '\'这是第二个文件\'' ]   总共花了4s 的时间得到结果,取最慢的时间为准

//有错误的情况下
async.parallel([
    function (cb) {
        setTimeout(() => {
            util.readFile(path.join(__dirname, 'text/1.txt'), cb)
        }, 4000)
    },
    function (cb) {
        setTimeout(() => {
            util.readFile(path.join(__dirname, 'text/3.txt'), cb)
        }, 3500)
    },
    function (cb) {
        setTimeout(() => {
            util.readFile(path.join(__dirname, 'text/2.txt'), cb)
        },3000)
    }
], (err, data) => {
    console.log(err)
    console.log(data) 
})
//{ [Error: ENOENT: no such file or directory, open //'/Users/apple/code/node/7.async/text/3.txt']
// errno: -2,
// code: 'ENOENT',
//syscall: 'open',
//path: '/Users/apple/code/node/7.async/text/3.txt' }
//[ , undefined, '\'这是第二个文件\'' ]

1.并行执行,花费时间最长的那个即是所有程序运行完的时间.
2.无错误的情况下,所有结果按照函数所在数组中的组合的顺序而不是执行完的顺序进行排列进最终函数数组中
3.有错的情况下,立即中断所有函数运行并且把错误信息和已经获取到的值传递给最终函数,在中断之后没有获取到的值在最终函数中占一个空位置,中断的函数也会用获取的错误信息占据一个位置.


  • waterfall(串行 有关联 不支持json)
//不报错的情况下
async.waterfall([
    function (cb) {
        setTimeout(() => {
            util.readFile(path.join(__dirname, 'text/1.txt'), cb)
        }, 3000)
    },
    function (prevData, cb) {
        console.log(prevData)  //‘这是第一个文件’
        setTimeout(() => {
            util.readFile(path.join(__dirname, 'text/2.txt'), cb)
        },1000)
    }
], (err, data) => {
    console.log(err)    //null
    console.log(data)   //'这是第二个文件'  总共花费4s
})
//报错的情况下
//报错
async.waterfall([
    function (cb) {
        setTimeout(() => {
            util.readFile(path.join(__dirname, 'text/1.txt'), cb)
        }, 3000)
    },
    function (prevData, cb) {
        console.log(prevData)  //‘这是第一个文件’
        setTimeout(() => {
            util.readFile(path.join(__dirname, 'text/3.txt'), cb)
        },1000)
    },
    function (prevData, cb) {
        console.log(prevData)  //根本不会执行这一步
        setTimeout(() => {
            util.readFile(path.join(__dirname, 'text/2.txt'), cb)
        },1000)
    }
], (err, data) => {
    console.log(err)    //{ [Error: ENOENT: no such file or directory, open '/Users/apple/code/node/7.async/text/3.txt']
                        //errno: -2,
                        //code: 'ENOENT',
                        //syscall: 'open',
                        //path: '/Users/apple/code/node/7.async/text/3.txt' }
    console.log(data)   //'undefined'
})

1.执行完一步在执行下一步,程序花费的时间等于所有函数执行完的函数.
2.无错误的情况下,每一步函数的第一个参数就是上个函数注入回调的第二个参数
3.有错误的情况下,立刻终止函数的运行,并把错误信息err返回给最终函数,当然错误的这个函数依旧可以传入第二个参数当做最终函数的第二个参数,至于传什么自己看心情传吧- -

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • //公共引用 varfs =require('fs'), path =require('path'); 1、读取文...
    才気莮孒阅读 844评论 0 1
  • 一、核心模块和对象 核心模块的意义 常用内置模块path:处理文件路径fs:操作文件系统child_process...
    EndEvent阅读 4,442评论 0 1
  • https://nodejs.org/api/documentation.html 工具模块 Assert 测试 ...
    KeKeMars阅读 6,464评论 0 6
  • 个人入门学习用笔记、不过多作为参考依据。如有错误欢迎斧正 目录 简书好像不支持锚点、复制搜索(反正也是写给我自己看...
    kirito_song阅读 2,523评论 1 37
  • Node.js 常用工具 util 是一个Node.js 核心模块,提供常用函数的集合,用于弥补核心JavaScr...
    FTOLsXD阅读 549评论 0 2