求异步大神分析一下这段代码的几个callback分别代表什么意思

看着头晕,一个异步模块开源项目的代码,回调有点绕,都理不清各自的callback了,异步大神帮忙分析一下这段代码。

const fs = require('fs')

const files = ['./file/1.js', './file/2.js', './file/3.js']

function series(tasks, callback) {
    callback = callback || function() {}
    let results = Array.isArray(tasks) ? [] : {}

    eachOfSeries(tasks, function(task, key, callback) {
        task(function(err, data) {
            results[key] = data 
            callback(err)
        })
    }, function(err) { 
        callback(err, results) 
    })
}


series([function(callback) {
    fs.access('./file/1.js', function(err) {
        callback(null, err ? false : true)
    });
}, function(callback) {
    fs.readFile('./file/2.js', function(err, data) {
        callback(err, data)
    });
}], function(err, results) {
    if (err) {
        throw err;
    }
    console.log(results);
});


function eachOfSeries(arr, fn, 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) {
            return callback(err)
        }
        if (sync) {
            setImmediate(next)
        } else {
            next()
        }
    }

    function once(fn) {
        return function() {
            if (!fn) {
                return
            }
            fn.apply(this, arguments)
            fn = null
        }
    }
}
阅读 1.8k
评论
    2 个回答
    • 1.9k
    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
            }
        }
    }
      相似问题
      推荐文章