javascript中无参数的回调
我有一个带有回调的nodejs代码,我无法理解它是如何工作的。有人能解释一下吗javascript中无参数的回调,javascript,node.js,function,callback,Javascript,Node.js,Function,Callback,我有一个带有回调的nodejs代码,我无法理解它是如何工作的。有人能解释一下吗 function readJSONIntoArray(directory, array, callback) { var ending = 'json'; fs.readdir(directory, function (err, files) { if (err) throw err; var fileCnt = files.lengt
function readJSONIntoArray(directory, array, callback)
{
var ending = 'json';
fs.readdir(directory, function (err, files)
{
if (err)
throw err;
var fileCnt = files.length;
files.forEach(function (file)
{
if (endsWith(file, '.' + ending))
{
file = file.substring(0, file.length - (ending.length + 1));
var fileContent = require(path.join(directory, file));
array.push(fileContent);
log.info('Read file: ' + file);
}
fileCnt--;
if (fileCnt === 0 && typeof callback === 'function')
{
callback();
}
});
});
}
这里的回调是空的,所以我猜没有返回值。但在实际输出中,返回数组。我不明白空回调可以返回数组
函数调用:readJSONIntoArray(profilefolder、profiles、setProfileDescriptions)代码>
setProfileDescriptions的定义是单独的
function setProfileDescriptions()
{
profiles = bubblesort(profiles, 'order');
}
在setProfileDescriptions
中,配置文件数组由read函数中读取的文件中的json数据填充。
有人能解释一下如何将readJSONIntoArray
函数调用中的第三个参数识别为函数并返回数组配置文件吗
var globalArray=[];
function readFunction(path,globalArray,callbackFunction){
globalArray.push(path);
callbackFunction();
}
function callbackFunction(){
//globalArray was global so i can call here
console.log(globalArray);
}
readFunction('filePath',globalArray,callbackFunction);
考虑上面的代码,因为声明为全局的“globalArray”可以在回调函数中访问
考虑上面的代码,因为声明为全局的“globalArray”可以在回调函数中访问您是对的,readJSONIntoArray
在它的回调
中不返回任何内容。相反,它将新数据附加到第二个参数数组
,从而对其进行变异
因此,readJSONIntoArray
的使用方式如下:
var content = []; // empty array to accumulate data from readJSONIntoArray function
readJSONIntoArray('some directory', content, function () {
// content is full of data now
doSomething(content);
});
尽管我必须指出,这不是node.js中常见的模式,应该避免,因为它太令人困惑了
事实上,在readJSONIntoArray
实现中有几件事做得不对:
- 函数不应该改变它们的参数李>
- 异步函数不应该
抛出错误,而是应该在回调中返回它们李>
- 函数生成的任何数据也应在
回调中返回
您是对的,readJSONIntoArray
在其回调中不返回任何内容。相反,它将新数据附加到第二个参数数组
,从而对其进行变异
因此,readJSONIntoArray
的使用方式如下:
var content = []; // empty array to accumulate data from readJSONIntoArray function
readJSONIntoArray('some directory', content, function () {
// content is full of data now
doSomething(content);
});
尽管我必须指出,这不是node.js中常见的模式,应该避免,因为它太令人困惑了
事实上,在readJSONIntoArray
实现中有几件事做得不对:
- 函数不应该改变它们的参数李>
- 异步函数不应该
抛出错误,而是应该在回调中返回它们李>
- 函数生成的任何数据也应在
回调中返回
配置文件未作为参数提供给setProfileDescription
。但是,如果您可以访问该变量,则该变量可能是全局变量。profiles未作为参数提供给setProfileDescription
。但是,该变量可能是全局变量,如果这样,您可以访问它。在您的示例中,globalArray
是readFunction
的参数,而不是全局变量。但我首先声明globalArray。因此,它应该被视为全局变量“右”?“否”,在“代码>读取函数< /代码>的内部,它被局部变量所遮蔽。因此,您的“全局”globalArray
不会受到readFunction
的影响,除非它作为参数传递。在您的示例中,在readFunction
之前声明它完全不起任何作用。因此,如果它被作为局部变量的“readFunction”隐藏。那么我应该无法将“globalArray”值记录到console right?中?。但是我可以记录值,如果您在callbackFunction
中引用console.log
,那么您将记录“global”globalArray
,因为它没有阴影。对于readFunction
,您在那里作为参数传递完全相同的globalArray
,但在函数内部您仍然在处理局部变量。这正是您调用readFunction
的方式,使其成为与“global”globalArray
完全相同的数组。在您的示例中,globalArray
是readFunction
的参数,而不是全局变量。但我首先声明globalArray。因此,它应该被视为全局变量“右”?“否”,在“代码>读取函数< /代码>的内部,它被局部变量所遮蔽。因此,您的“全局”globalArray
不会受到readFunction
的影响,除非它作为参数传递。在您的示例中,在readFunction
之前声明它完全不起任何作用。因此,如果它被作为局部变量的“readFunction”隐藏。那么我应该无法将“globalArray”值记录到console right?中?。但是我可以记录值,如果您在callbackFunction
中引用console.log
,那么您将记录“global”globalArray
,因为它没有阴影。对于readFunction
,您在那里作为参数传递完全相同的globalArray
,但在函数内部您仍然在处理局部变量。这正是您调用readFunction
的方式,使其成为与“global”globalArray
完全相同的数组。