Node.js fs - 为什么需要这个检查?

时间:2014-02-04 21:08:32

标签: node.js

为什么需要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?

1 个答案:

答案 0 :(得分:1)

在这里,当文件在forEach上抛出错误时,编写该代码的人不希望迭代fs.stat中的所有文件。

当文件确实在fs.stat上抛出错误时,forEach中的所有后续迭代将返回(if (errored) return)。

变量不是必需,但我们会说这样更干净。

要回答您的编辑,会针对files数组中的每个元素触发回调。