//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返回给最终函数,当然错误的这个函数依旧可以传入第二个参数当做最终函数的第二个参数,至于传什么自己看心情传吧- -
网友评论