Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中的不同作用域之间返回值_Javascript_Node.js_Scope_Closures - Fatal编程技术网

在javascript中的不同作用域之间返回值

在javascript中的不同作用域之间返回值,javascript,node.js,scope,closures,Javascript,Node.js,Scope,Closures,我是Javascript的新手,也是经验丰富的程序员,我正在努力掌握模式和设计中的概念,以便在构建应用程序时使用和处理最佳结构。 有几个领域对我来说是相当陌生的,其中之一就是掌握Javascript的作用域和闭包 所以为了让这篇文章尽可能的清晰,我在这篇文章中附上了一个代码示例,希望有人能把我的逻辑放在适当的位置,给我一个重新思考和正确思考的指南 我发布的代码是一个非常简单的文件系统/助手库(Node.js,express)的一部分,该库用于扫描目录,在这些目录上运行一些条件,并将结果作为数组维

我是Javascript的新手,也是经验丰富的程序员,我正在努力掌握模式和设计中的概念,以便在构建应用程序时使用和处理最佳结构。 有几个领域对我来说是相当陌生的,其中之一就是掌握Javascript的作用域和闭包

所以为了让这篇文章尽可能的清晰,我在这篇文章中附上了一个代码示例,希望有人能把我的逻辑放在适当的位置,给我一个重新思考和正确思考的指南

我发布的代码是一个非常简单的文件系统/助手库(Node.js,express)的一部分,该库用于扫描目录,在这些目录上运行一些条件,并将结果作为数组维度的映射返回到另一个库(未发布)。您看到的代码是我当前的“测试”状态。我已经公正地评论过了

要点:(全视图或代码/库)

示例代码块(返回值有问题)

ApiFS.prototype.scan=function(){
var self=这个;
var b;
fs.readdir(stgs.fsPath,函数(err,文件夹){

如果(folders.length这与作用域无关,则与时间有关。
readdir
是异步的。它将请求发送到文件系统,然后让前面的函数继续执行

console.log(b);
b=self.loader()执行之前执行


如果要处理来自接受回调的函数的数据,则需要在回调内部执行该工作。

昆廷是正确的。您肯定必须习惯节点程序的异步性质。为了清楚起见,这应该按照您的预期工作

ApiFS.prototype.scan = function(callback){          
    var self = this;
    var b;
    fs.readdir(stgs.fsPath, function(err, folders) {      
        if(folders.length<1) { console.log(errLog.fsEmpty); return; }

        var results = [];
        async.each(folders, function(folder) {
            if(!self.exclusion(folder)) { 
                results.push(self.loader(stgs.fsPath, itm)); 
            }            
        }, function() {});

        if(typeof(callback) == "function") {
            callback(b);
        }
    });
}

ApiFS.scan(function(files) {
    // Do something with files
});
ApiFS.prototype.scan=函数(回调){
var self=这个;
var b;
fs.readdir(stgs.fsPath,函数(err,文件夹){

如果(Looths.Langthi)问你是否可以详细阐述这一点,不是因为我认为你的答案是错误的,只是为了确保我有一个清晰的理解。我的结构(设计)和逻辑是正确的,我只是在接近异步函数处理错误的值,所以不是执行前次()和我的自定义函数。“里面"异步轮盘,我应该把这些放在ioResponse中?我误解了你的答案吗?Thanksfs.readdir只接受两个参数。ioResponse是做什么的?我不知道,这段代码是我学习的沙箱。谢谢你的帮助!其他有兴趣探索回调的人也请访问:Timothy,谢谢你给我解释一下更进一步。我理解您现在看到代码“example”是什么意思。我想知道,如果我要从self.loader()返回b的值;(一个数组)作为该函数“scan()”的最终返回,我会使用forEach()的回调来处理这个问题。我对如何在fs.readdir()之后进行最终返回感到有点困惑从fs.readdir()的“内部”收集的值-看起来不短也不愚蠢。这是我进行节点开发的第三天。例如,函数scan(){var b;fs.readdir(){iterate…b=values}返回b;}请记住,由于您在扫描内部使用异步函数,因此无法返回值,您必须提供一个在扫描完成后调用的回调。我将更新示例以向您展示回调以及如何使用它。谢谢。那太棒了,我将在“代码”中直观地学习这一点。好的,已更新。另一件需要记住的事情是节点中唯一的非阻塞代码是您编写的代码。我不确定self.loader的功能,但如果self.loader很慢,或者forEach有很多项,则整个应用程序将挂起,直到处理完为止。您可能希望使用一个forEach的异步版本,就像异步模块中的每个版本一样e、 感谢您的更新,我现在对这一点有了更好的理解,我只需要习惯node处理函数之间的返回和调用的方式。现在对我来说,这似乎更符合逻辑。上面介绍的forEach使用async.each/map进行异步,就像我在“walk()”中所做的一样,请参见要点:
ApiFS.prototype.scan = function(callback){          
    var self = this;
    var b;
    fs.readdir(stgs.fsPath, function(err, folders) {      
        if(folders.length<1) { console.log(errLog.fsEmpty); return; }

        var results = [];
        async.each(folders, function(folder) {
            if(!self.exclusion(folder)) { 
                results.push(self.loader(stgs.fsPath, itm)); 
            }            
        }, function() {});

        if(typeof(callback) == "function") {
            callback(b);
        }
    });
}

ApiFS.scan(function(files) {
    // Do something with files
});
var fs = require('fs'),
    async = require('async'),
    _ = require('underscore'),
    path = require('path');

ApiFS = function(options){
    errLog = [];
    errLog.fsEmpty = "No existing directories or empty, cannot continue."; 
}

ApiFS.prototype.scan = function(callback) {          
    var self = this,
        results = {};
    fs.readdir(options.fsPath, function(err, folders) {
        if(folders.length<1) return callback(errLog.fsEmpty);       
        async.forEach(folders, function(folder) {
            if(!self.exclude(folder)) {
                self.loadFiles(folder, function(err, files) {
                    results[folder] = files;
                });
        }, function(err) {
            callback(err, results);
        });                     
    });     
}

ApiFS.prototype.exclude = function(folder){       
    if(options.exclude.length === 0){
        return false;
    }

    return _.contains(options.exclude, folder);
}

ApiFS.prototype.loadFiles = function(folder, callback) { 
    fs.readdir(path.join(options.fsPath, folder), function(err, files) {
        callback(err, files);
    });
};

exports = module.exports = ApiFS;