倚天杖
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 } }}