2014-02-04 4 views
0

Зачем нужна переменная errored?Node.js fs - зачем нужна эта проверка?

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. Там он говорит: «errored boolean, чтобы предотвратить вызов вызываемого вызова (cb) более одного раза, если возникает ошибка». Может ли кто-нибудь объяснить это мне? При каких обстоятельствах cb можно называть более одного раза?

+0

Чтобы остановить ранний случай, если вы получите сообщение об ошибке – SLaks

ответ

1

Здесь кто бы ни писал этот код, не хочет перебирать все файлы в forEach, когда файл выдает ошибку на fs.stat.

Когда файл сделал ошибку fs.stat, все последующие итерации в forEach собираются вернуть (if (errored) return).

Переменная не требуется, но мы скажем, что это чище.

Чтобы ответить на ваше редактирование, обратный вызов запускается для каждого элемента массива files.

Смежные вопросы