我把 filelist[i] 放到 $,它变成了 undefined

Posted

技术标签:

【中文标题】我把 filelist[i] 放到 $,它变成了 undefined【英文标题】: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。 【参考方案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@循环。

【讨论】:

以上是关于我把 filelist[i] 放到 $,它变成了 undefined的主要内容,如果未能解决你的问题,请参考以下文章

C#ArrayList重复数据删除

为啥 DeepLabV3+ 生成的所有图像都只变成黑色?

我把vmdk文件打开方式改成Vmware15,重启后为啥变成360压缩了?

解析文件中的二进制文件

当我把 MouseListener 类变成错误 [关闭]

java实现有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数