2015-10-26 64 views
0

我是一個node.js noob,並試圖做一些文件處理。我使用異步來處理文件數組,但回調函數從不被調用。我相信這是由於調用next()函數兩次,但我不知道我在做什麼。如果我註釋掉最後一個「return next()」,我完成了沒有錯誤,但最終回調沒有執行。如果我取消註釋掉這一行,我會收到錯誤消息「回調已被調用」。任何幫助將不勝感激。下面是代碼:Node.js async.each - 「回調已被調用」

/*jslint node: true */ 
"use strict"; 

var fs = require('fs'), 
    dive = require('dive'), 
    subdirs = require('subdirs'), 
    async = require('async'), 
    currentYear = new Date().getFullYear(), 
    cpFile = __dirname + "/" + "header.txt", 
    noCopy = __dirname + "/" + "noCopyright.txt", 
    currentHeads = __dirname + "/" + "currentHeaders.txt", 
    reYear = /\s(\d{4})[-\s]/i, // matches first 4 digit year 
    reComment = /(\/\*(?:(?!\*\/).|[\n\r])*\*\/)/, // matches first multi-line comment 
    allHeaders = {}, 
    stringObj, 
    year, 
    top; 

function needsHeader (file) { 
    if ((file.match(/.*\.js$/) || file.match(/.*\.less$/) || file.match(/.*\.groovy$/) || file.match(/.*\.java$/) || file.match(/.*\.template$/) || file.match(/.*\.html$/))) { 
     fs.appendFile(noCopy, file + "\n", function (err) { 
      if (err) { 
       return console.log(err); 
      } 
     }); 
    } 
} 

fs.readFile(cpFile, 'utf8', function (err, copyRight) { 
    if (err) { 
     return console.log(err); 
    } 
    subdirs(__dirname, 4, function (err, dirs) { 
     if (err) { 
      return console.log(err); 
     } 
     async.each(dirs, function (dir, next) { 
      if (! dir.match(/.*\/src$/)) { 
       return next(); 
      } else { 
       dive(dir, {all: false}, function (err, file) { 
        if (err) { 
         return next(err); 
        } else { 
         fs.readFile(file, 'utf8', function (err, data) { 
          if (err) { 
           return next(err); 
          } else { 
           if (data.match(reComment) && (file.match(/.*\.js$/) || file.match(/.*\.less$/) || file.match(/.*\.groovy$/) || file.match(/.*\.java$/) || file.match(/.*\.template$/))) { 
            top = data.match(reComment)[0]; 
            if (top.match(reYear)) { 
             year = top.match(reYear)[1]; 
             if (allHeaders[year]) { 
              allHeaders[year].push(file); 
             } else { 
              allHeaders[year] = [file]; 
             } 
            } else { 
             needsHeader(file); 
            } 
           } else { 
            needsHeader(file); 
           } 
           return next(); 
          } 
         }); 
        } 
       }); 
      } 
     }, function (err) { 
      if (err) { 
       console.log(err); 
      } 
      stringObj = JSON.stringify(allHeaders, null, 4); 
      fs.writeFile(currentHeads, stringObj, function (err) { 
       if (err) { 
        return console.log(err); 
       } 
      }); 

     }); 
    }); 
}); 
+0

潛水呼叫你的回叫多次嗎? – Bergi

回答

3

它希望您來電next()每個目錄,您在調用它在目錄中找到的每個文件。因此,只要某個目錄包含2個或更多文件,就會出現錯誤。

要修復它,請嘗試撥打next()完成潛水。見dive documentation

完全[可選]可以定義第二回調,那個叫, 當所有文件已被處理。它不需要任何參數。

dive(dir, {all: false}, function (err, file) { 
    if (err) { 
    return next(err); 
    } else { 
     // your file handling code here 
    } 
}, function complete() { 
    next(); 
}); 
+0

要建立@ataman偉大的答案,你可以替換'function complete(){next(); ''只需'next'。 – Guy