2015-06-27 53 views
0

/file_iterator.js通外范围的逻辑的回调函数的JavaScript的NodeJS

var asyncFileObjectReader = require('../core/async_forEach_Array.js') 
var sampleFunction; 

function allAcitemFileIterator(filesObject, mapContainer, root_directory) {  

    asyncFileObjectReader.forEachFunction(filesObject, sampleFunction); 

    sampleFunction = function (fileName) { 
     mapContainer.set(basePathAlterColons.removeBasePathAlterColons(fileName, root_directory), 
      extractUriFromList.extractUriFromList(getReferences.getReferences(fileName))); 
    } 
} 

/async_foreach_Array.js

function forEachFunction(filesObject, filesObjectFunction) { 
    filesObject.forEach(function (fileName) { 
     if (path.extname(fileName) === acitem_file_extension) { 
      filesObjectFunction(fileName); 
     } 
    }); 
} 

当试图通过sampleFunction作为回调函数到forEachFunction,但仍然保持外部函数的状态,我得到一个错误,因为“未定义为不是函数”请帮助?

回答

2

在定义它之前,您正在使用该功能!互换这两个语句:

sampleFunction = function (fileName) { 
    mapContainer.set(basePathAlterColons.removeBasePathAlterColons(fileName, root_directory), 
     extractUriFromList.extractUriFromList(getReferences.getReferences(fileName))); 
}; 

asyncFileObjectReader.forEachFunction(filesObject, sampleFunction); 

哦,真的没有理由让sampleFunction全球你的模块。特别是当你使用mapContainerroot_directory作为闭包变量时,在异步函数中。如果allAcitemFileIterator被称为太快,这将导致可怕的竞争条件。所以请使用var sampleFunction = …,或者只是一个函数声明。

+0

OMG,谢谢Bergi,我的功能像魅力一样工作。你拯救了我的一天。再次感谢你,祝你有美好的一天。 –