【问题标题】:Javascript variable assignment is 'undefined' in subsequent statement [duplicate]Javascript变量赋值在后续语句中是“未定义的”[重复]
【发布时间】:2017-08-09 23:38:30
【问题描述】:

我在 node/express 应用程序提供的网页中嵌入了一个 dropzone.js 小部件。这一切都很有名,所以我添加了提供上传约束的条件。有三个这样的约束; mime 类型(那个可以正常工作)、上传的文件大小(也可以正常工作)和文件数量(不能正常工作)。

这是代码中的一个 sn-p:

var fileSize = req.file.size;
if(fileSize > 200000) {
  return res.status(422).json({
    error: "File too large."
  });
}

var numfiles = fs_filecount(appwd+"data/free/req.session.freeFolderID");
if(numfiles>20) {
  return res.status(422).json({
    error: "Maximum file count reached."
  });
}

我这样呈现这两个赋值和条件是因为它们在 .js 文件中是这样显示的。文件大小的分配和条件效果很好,但文件计数却没有。 fs_filecount函数的源码如下:

fs_filecount = function(path) {
  fs.readdir(path,function(err, files){
    if(err){
      return console.error(err);
    } else {
      return files.length;
    }
  });
};

请注意,记录此文件计数函数返回的值直接表明它工作正常。

失败之处在于numfiles赋值后未定义,所以文件计数测试总是失败,并且从不强制执行不超过20个文件的约束。

编辑:简化的子程序“fs_filecount”如下:

function fs_filecount(path) {
  var count;
  fs.readdir(path,function(err,files) {
    if(err) throw err;
    else {
      count = files.length;
    }
  });
  return count;
};

【问题讨论】:

  • fs.readdir 是一个 asnyc 函数,因此您传递给readdir 的回调在fs_filecount 的退出之后调用,所以您不能使用return 语句从fs_filecount 返回readdir 的结果。您要么需要使用 Promise 作为返回值,要么还需要使用 fs_filecount 的回调。

标签: javascript variables undefined variable-assignment


【解决方案1】:

fs.readdir是一个异步函数,所以你传递给readdir的回调是在fs_filecount退出后调用的,所以不能使用return语句来返回@的结果987654325@ 来自fs_filecount

您要么需要使用 Promise 作为返回值,要么使用 fs_filecount 的回调。

基于 Promise 的解决方案如下所示

function fs_filecount(path) {
  return new Promise((resolve, reject) => {
    fs.readdir(path, (err, files) => {
      if (err) {
        reject(err)
      } else {
        resolve(files.length)
      }
    })
  })
}

以及如何使用它:

fs_filecount(appwd + "data/free/req.session.freeFolderID")
  .then(numfiles => {
    if (numfiles > 20) {
      return res.status(422).json({
        error: "Maximum file count reached."
      })
    }
  })
  .catch(err => {
    console.log('there was an error: ' + err)
  })

有关更多详细信息,请查看以下问题:How do I return the response from an asynchronous call?

【讨论】:

  • 你比我先到了那里。适合我在手机上编写代码!只在我上电脑时才发现它是一个异步函数,并且返回不会削减它。
  • @ConorGallagher 如果一个函数接受一个回调并且回调的一个(通常是第一个)参数是错误,那么你总是必须假设它是异步的,因为同步函数可能会抛出错误而不是将其传递给回调。
猜你喜欢
  • 1970-01-01
  • 2014-10-04
  • 2012-03-22
  • 2020-06-29
  • 2020-09-16
  • 1970-01-01
  • 2017-07-01
  • 2020-08-31
  • 1970-01-01
相关资源
最近更新 更多