为什么需要errored
变量?
var fs = require('fs')
var path = require('path')
module.exports = function (dir, cb) {
fs.readdir(dir, function (er, files) { // [1]
if (er) return cb(er)
var counter = files.length
var errored = false
var stats = []
files.forEach(function (file, index) {
fs.stat(path.join(dir,file), function (er, stat) { // [2]
if (errored) return
if (er) {
errored = true
return cb(er)
}
stats[index] = stat // [3]
if (--counter == 0) { // [4]
var largest = stats
.filter(function (stat) { return stat.isFile() }) // [5]
.reduce(function (prev, next) { // [6]
if (prev.size > next.size) return prev
return next
})
cb(null, files[stats.indexOf(largest)]) // [7]
}
})
})
})
}
来自http://strongloop.com/strongblog/node-js-callback-hell-promises-generators的博客条目的代码。它说:“错误的布尔值,以防止在发生错误时多次调用提供的回调(cb)”。有人可以帮我解释一下吗?在什么情况下可以不止一次调用cb?
答案 0 :(得分:1)
在这里,当文件在forEach
上抛出错误时,编写该代码的人不希望迭代fs.stat
中的所有文件。
当文件确实在fs.stat
上抛出错误时,forEach
中的所有后续迭代将返回(if (errored) return
)。
变量不是必需,但我们会说这样更干净。
要回答您的编辑,会针对files
数组中的每个元素触发回调。