【问题标题】:I put filelist[i] to ${}, It become to undefined我把 filelist[i] 放到 ${},它变成了 undefined
【发布时间】:2020-01-14 22:28:34
【问题描述】:

我在“./src/commands”上获得了文件列表,这些文件需要映射名为“cmds”的数组。 我想要'./src/commands/'中的文件夹,也需要文件夹中的文件来映射数组的二维数组。

我调试了许多数组和变量,但我不明白为什么会发生变化。

fs.readdir('./src/commands', function(err, fl) {
    if (err) return;
    for (var i = 0; i < fl.length; i++) {
        if (!fl[i].endsWith('.js')) {
            fs.readdir(`./src/commands/${fl[i]}`, function(err, flin) {
                if (err) return;
                cmds[fl[i]] = {};
                for (var j = 0; j < flin.length; j++) {
                    cmds[fl[i]][flin[j].split(".js")[0]] = require(`./commands/${fl[i]}/${flin[j]}`);
                    console.log(`${fl[i]}/${flin[j]} loaded!`);
                }
            });
            continue;
        }
        cmds[fl[i].split(".js")[0]] = require(`./commands/${fl[i]}`);
        console.log(`${fl[i]} loaded!`);
    }
});

错误信息:

internal/modules/cjs/loader.js:628
    throw err;
    ^

Error: Cannot find module './commands/undefined/test.js'
Require stack:
- E:\git-project\VitaBot\src\main.js
[90m    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:625:15)[39m
[90m    at Function.Module._load (internal/modules/cjs/loader.js:527:27)[39m
[90m    at Module.require (internal/modules/cjs/loader.js:683:19)[39m
[90m    at require (internal/modules/cjs/helpers.js:16:16)[39m
    at E:\git-project\VitaBot\src\main.js:15:60
[90m    at FSReqCallback.oncomplete (fs.js:153:23)[39m {
  code: [32m'MODULE_NOT_FOUND'[39m,
  requireStack: [ [32m'E:\\git-project\\VitaBot\\src\\main.js'[39m ]

我认为它自然需要,但事实并非如此。

【问题讨论】:

  • 对于初学者,请将var i 更改为let i,这样您的i 变量对于for 循环的每次迭代都是唯一的,并且适用于稍后运行的异步操作。我不知道这段代码的其余部分在做什么或你在问什么,但这绝对是一个需要修复的问题。
  • @jfriend00 非常感谢。我解决了导致我痛苦的问题。我将在循环中使用 let。

标签: javascript node.js ecmascript-6 discord.js fs


【解决方案1】:

var i 更改为let i,这样您的 i 变量对于 for 循环的每次迭代都是唯一的,并且可以与稍后运行的异步操作一起使用。

在您的代码中,for 循环运行至完成。在循环的每次迭代中,它都会启动一个fs.readdir() 操作,但由于它是非阻塞和异步的,它不会立即完成。相反,循环的下一次迭代运行并开始另一个。这将完成,直到 for 循环完全完成。然后,稍后,您的第一个 fs.readdir() 操作完成并调用它的回调并且该回调运行。但是,此时您的一个索引变量i 指向for 循环的末尾之外,这意味着fl[i] 将指向fl 数组的末尾之外,您只会得到一个undefined 值。这将发生在所有 fs.readdir() 回调中,因为它们每个都被调用。

另一方面,let i 会为循环的每个单独迭代创建一个新变量 i,因此当您的 fs.readdir() 回调运行时,它仍然会看到 i 迭代的所需值 @ 987654337@循环。

【讨论】:

    猜你喜欢
    • 2016-05-24
    • 2017-07-01
    • 2014-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多