//text目錄
1.txt
2.txt
//util.js
var fs = require('fs')
module.exports = {
//異步返回讀取的文件內(nèi)容
readFile (filePath, cb) {
fs.readFile(filePath, 'utf-8', (err, data) => {
cb(err, data)
})
}
}
一.流程控制類
- series(串行控制,互不干擾,執(zhí)行完一項在執(zhí)行下一步,數(shù)據(jù)沒關(guān)聯(lián))
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) //注入回調(diào) 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 的時間得到結(jié)果
1.series 參數(shù)支持數(shù)組或者 Json格式相應(yīng)的最終的回調(diào)函數(shù)里面的結(jié)果也相應(yīng)的變成數(shù)組或者 Json.
2.series 串行, 執(zhí)行完一個在執(zhí)行下一個,所以最終函數(shù)的響應(yīng)時間等于各個函數(shù)的執(zhí)行時間之和.
3.某個函數(shù) 報錯或者得到 err 對象,那么直接終止下面的函數(shù)運行,并且把錯誤對象傳到最后的函數(shù).
- parallel(并行執(zhí)行,所有函數(shù)同時進行,支持Json格式的函數(shù)访敌,數(shù)據(jù)無關(guān)聯(lián))
//無錯誤的情況下
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 的時間得到結(jié)果,取最慢的時間為準
//有錯誤的情況下
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.并行執(zhí)行蠢挡,花費時間最長的那個即是所有程序運行完的時間.
2.無錯誤的情況下嫩与,所有結(jié)果按照函數(shù)所在數(shù)組中的組合的順序而不是執(zhí)行完的順序進行排列進最終函數(shù)數(shù)組中
3.有錯的情況下涕刚,立即中斷所有函數(shù)運行并且把錯誤信息和已經(jīng)獲取到的值傳遞給最終函數(shù)晓避,在中斷之后沒有獲取到的值在最終函數(shù)中占一個空位置簇捍,中斷的函數(shù)也會用獲取的錯誤信息占據(jù)一個位置.
- waterfall(串行 有關(guān)聯(lián) 不支持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) //根本不會執(zhí)行這一步
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.執(zhí)行完一步在執(zhí)行下一步只壳,程序花費的時間等于所有函數(shù)執(zhí)行完的函數(shù).
2.無錯誤的情況下,每一步函數(shù)的第一個參數(shù)就是上個函數(shù)注入回調(diào)的第二個參數(shù)
3.有錯誤的情況下垦写,立刻終止函數(shù)的運行吕世,并把錯誤信息err返回給最終函數(shù),當然錯誤的這個函數(shù)依舊可以傳入第二個參數(shù)當做最終函數(shù)的第二個參數(shù)梯投,至于傳什么自己看心情傳吧- -