为什么我的Node.js函数(其中涉及fs.readdir)在后续代码片段之后执行?

Why is my Node.js function (which involves fs.readdir) executed after the subsequent code fragment?

我在 Visual Studio 代码中尝试使用 Node.js (v8.9.4) 读取目录时遇到问题。我有一个名为 readExperiments 的函数,它通过我的目录和 returns 一组实验运行。但是不知何故首先执行函数调用之后的代码(这导致 "undefined" 问题场景)。 experimentReader.js 中的 console.log 语句和 mustacheModelCreator.js 中的 for 循环用于调试目的。

我的函数在之后执行是否有一个微不足道的原因(可能是由于其可怕的嵌套样式),是否有强制先执行我的 readExperiments() 函数的解决方案?

非常感谢你的帮助(顺便说一句:我是一个 javascript 初学者)。

mustacheModelCreator.js

中的代码
var experiments = experimentReader.readExperiments();
for(k = 0; k < 1;k++)
{
    console.log("Outside experiments: " + experiments[k]);
}
var experimentPaths = experimentReader.getExperimentPaths();
var patients = patientReader.readPatients(experimentPaths);

experimentReader.js中的代码:

module.exports.readExperiments = function()
{
    var experiments = new Array();
    fs.readdir(rootPath, function(err, rootDirectory)
    {
        if(err) throw err;
        for(i = 0; i < rootDirectory.length; i++)
        {
            console.log("Root Directory: " + rootDirectory[i]);
            if(rootDirectory[i]=="resources")
            {
                var resPath = path.join(rootPath,'/resources');
                fs.readdir(resPath, function(err2, resDirectory)
                {
                    console.log("Resources Directory: " + resDirectory[i]);
                    if(err2) throw err2;
                    for(j = 0; j < resDirectory.length; j++)
                    {
                        if(resDirectory[j] == "results")
                        {
                            var resultsPath = path.join(resPath,'/results');
                            var resultsDirectory;
                            fs.readdir(resultsPath, function(err3, resultsDirectory)
                            {
                                console.log("Results Directory: " + resultsDirectory[i]);
                                if(err3) throw err3;
                                for(p = 0; p<resultsDirectory.length;p++)
                                {
                                    experiments.push(resultsDirectory[p]);
                                    console.log("Inside experiments: " + experiments[p]);
                                }
                            });
                        }
                    }
                });
            }
        }
    });
return experiments;
}

结果:

外部实验:未定义

然后 experimentReader.js

中 readExperiments 的内部 console.log 语句

你的问题在于你使用的是异步函数。

当你说:

fs.readdir(path, function callback(x){} );

你的 callback 函数将在稍后的某个时间点执行,它可能会在 fs.readdir 调用之后立即执行,也可能会在一个小时后执行(不过通常是几毫秒 :) )

尝试将 readdir 的用法替换为 readdirSync,请参阅有关用法的文档:

https://nodejs.org/api/fs.html#fs_fs_readdirsync_path_options

另一种选择是使用 Promises 或只是普通的旧回调并拥抱 node.js

的异步特性

总结一下:

  • 你打电话给experimentReader.readExperiments();
  • 这将启动目录读取过程
  • 执行继续到

    for(k = 0; k < 1;k++) { console.log("Outside experiments: " + 实验[k]); }

  • 与此同时,您的 readExperiements 中的代码在运行,并且碰巧大多数时候它在查看 experiments 数组的循环之后完成。