1 回答
TA贡献1828条经验 获得超3个赞
const fs = require('fs')
const files = ['./file/1.js', './file/2.js', './file/3.js']
function series(tasks, callback) {
// 1.参数有 callback 的话就取 callback 没有就赋值一个空函数
callback = callback || function() {}
let results = Array.isArray(tasks) ? [] : {}
eachOfSeries(tasks, function(task, key, callback) {
task(function(err, data) {
results[key] = data
// 调用eachOfSeries里面的 callback 把 err 作为参数
callback(err)
})
}, function(err) {
// 调用1的上面callback 把 err,results 作为参数
callback(err, results)
})
}
series([function(callback) {
fs.access('./file/1.js', function(err) {
// 数组第一个函数的参数 callback
callback(null, err ? false : true)
});
}, function(callback) {
fs.readFile('./file/2.js', function(err, data) {
// 数组第二个函数的参数 callback
callback(err, data)
});
}], function(err, results) {
if (err) {
throw err;
}
console.log(results);
});
function eachOfSeries(arr, fn, callback) {
// 2.参数有 callback 的话就取 callback 没有就赋值一个空函数
callback = callback || function() {}
arr = arr || []
let i = -1
let sync = true
next()
function next() {
sync = true
if (++i == arr.length) {
return callback()
}
fn(arr[i], i, once(done))
sync = false
}
function done(err) {
if (err) {
// 返回 第二个 callback
return callback(err)
}
if (sync) {
setImmediate(next)
} else {
next()
}
}
function once(fn) {
return function() {
if (!fn) {
return
}
fn.apply(this, arguments)
fn = null
}
}
}
添加回答
举报