繁体   English   中英

回调和变量范围

[英]Callbacks and variable scope

我正在学习learningyounode教程,并遇到了一些有趣的问题,我试图弄清楚当您将变量用作回调函数时如何处理范围:

以下代码有效:

module.exports = function(filePath, fileExtention, callback){
  fs.readdir(filePath, function (err, list){
    if(err) return callback("Something went wrong", null) 
    var fileArray = []
    list.forEach(function(file){
      if(file.indexOf('.' + fileExtention) > -1) fileArray.push(file)
    })
    return callback(null, fileArray)
  })
}

尽管此代码引发未定义的fileExtention异常:

module.exports = function(filePath, fileExtention, callback){
  fs.readdir(filePath, cb)
}

var cb = function (err, list){
  if(err) return callback("Something went wrong", null) 
  var fileArray = []
  list.forEach(function(file){
    if(file.indexOf('.' + fileExtention) > -1) fileArray.push(file)
  })
  return callback(null, fileArray)
}

我试图理解为什么该变量超出了定义为cb的第二个回调函数的范围,以及由于该回调的签名是固定的,我将如何解决此问题。

解决方案将是设置为fileExtention参数的局部变量吗?

这行得通,但是我不知道这是否是处理传递给模块以维持范围的回调的正确方法:

var fs = require('fs')
var fe = ""
var cb;
module.exports = function(filePath, fileExtention, callback){
  fe = fileExtention
  cb = callback;
  fs.readdir(filePath, findFiles)
}

var findFiles = function (err, list){
  if(err) return cb("Something went wrong", null) 
  var fileArray = []
  list.forEach(function(file){
    if(file.indexOf('.' + fe) > -1) fileArray.push(file)
  })
  return cb(null, fileArray)
}

这两个链接将帮助您更好地了解Javascript的作用域和闭包如何工作:

一种理想的方法是创建另一个匿名函数,然后发送已创建函数的参数。 像这样:

module.exports = function(filePath, fileExtention, callback){
  fs.readdir(filePath, function(err, list) {
    cb(err, list, fileExtension, callback);
  });
}

var cb = function (err, list, fileExtension, callback) {
  if(err) return callback("Something went wrong", null) 
  var fileArray = []
  list.forEach(function(file){
    if(file.indexOf('.' + fileExtention) > -1) fileArray.push(file)
  })
  return callback(null, fileArray)
}

我试图理解为什么该变量超出了定义为cb的第二个回调函数的范围,以及由于该回调的签名是固定的,我将如何解决此问题。

它超出范围,因为尝试使用它的函数在定义它的函数之外声明。

解决方案将是设置为fileExtention参数的局部变量吗?

局部变量...在哪里?

里面有exports功能吗? 那已经是fileExtention了。

里面的cb函数? 您仍然必须从某个地方获取价值。


解决方案是首先做您想做的事情,然后在exports函数中创建函数。

另外,您可以制作另一个包含cb和对fs.readdir调用的函数,然后从exports调用该函数,并从那里传递您需要的所有值作为参数。


这可行,但是我不知道这是否是处理传递给模块以维持范围的回调的正确方法

根据经验:避免使用全局变量。 该特定构造看起来可能会受到竞争条件的影响。

简短答案以及解决方法:

module.exports = function(filePath, fileExtention, callback){
  var fileExtention = fileExtention
  fs.readdir(filePath, cb)
}

var cb = function (err, list){
  if(err) return callback("Something went wrong", null) 
  var fileArray = []
  list.forEach(function(file){
    if(file.indexOf('.' + fileExtention) > -1) fileArray.push(file)
  })
  return callback(null, fileArray)
}

最好吗 一定不行!

它行得通吗? 我认同!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM