我把 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的主要内容,如果未能解决你的问题,请参考以下文章