gpt4 book ai didi

javascript - 在运行时动态从文件加载函数

转载 作者:行者123 更新时间:2023-12-01 01:44:43 25 4
gpt4 key购买 nike

我有一些 Nodejs 代码,可以充当机器人玩的游戏的仲裁者。

每个机器人都将是它自己的文件,其中包含一些具有固定名称的预定义函数(每个机器人都会使用相同的名称和参数调用其函数,例如PlayRound() )。

现在我想在运行时在游戏中添加机器人。就像我告诉仲裁者 botName1 一样,它会在 bots 文件夹中查找名为 botName1.js 的文件,然后稍后能够调用 botName1.PlayRound() .

由于 require 似乎只适用于静态静态字符串,而不适用于运行时值,有没有办法做到这一点?

示例代码:

const readline = require('readline');
const readLine = readline.createInterface({ input: process.stdin });

var players = []
var playerFiles = [];

readLine.on('line', (ln) => {

var ws = ln.split(' ');

if (ws[0].toLowerCase() === 'add') {
players[players.length] = ws[1];
// I would like to add the file corresponding to the name here
} else if (ws[0].toLowerCase() === 'list'){
console.log('There are currently ' + players.length + ' players registered:');
for (var p in players) {
console.log(players[p]);
}
} else if (ws[0].toLowerCase() === 'start'){
// I would like to do this here
for (var playerFile in playerFiles) {
playerFiles[playerFile].PlayRound();
}
}

});

最佳答案

正如 @Kaito 所建议的,可以使用动态需求。但我永远不会更喜欢这样,如果你不知道可能会出现什么问题的话,那么绝对不会。动态要求使您的应用程序容易出现运行时错误,您可能没有处理这些错误,例如要求不存在的文件(最常见的错误)。

我想以@Kaito 和@Yash 建议/提供的内容为基础。

解决方案

  1. 在将 botname 映射到 botfilepath 的映射中累积所有机器人文件/函数
  2. 在您的逻辑中,首先检查您是否有与要加入的机器人相关的 botfile/botfunction
  3. 如果是,那么您可以安全地在运行时请求 botfile

在下面的示例中,我假设所有机器人文件都将存储在 bots 目录中。

示例

const fs        = require( "fs" ),
path = require( "path" ),
botsDir = path.join( __dirname, "bots" );

/** One time read to fetch all the bot files in bots dir */
const files = fs.readdirSync( botsDir ),
/** Here we create the map of bot and bot file path */
availableBots = files
.reduce( ( botMap, file ) => Object.assign( botMap, {
[ file.replace(".js", "") ] : path.join( botsDir, file )
} ), {} );

// Your code
const botThatWillBeJoiningAtRuntime = "BotC"; // This would be some calculation to determine bot that joins at runtime.

/** Here we safely require the bot file only if we have one corresponding to the bot that is joining */
if ( availableBots[botThatWillBeJoiningAtRuntime] ) {
const botFunc = require( availableBots[botThatWillBeJoiningAtRuntime] );
}

这种方法的好处 -

您在整个应用程序生命周期中进行一次文件操作并积累机器人文件,从而减少昂贵的文件 ios,然后 if 部分安全地需要机器人文件,具体取决于应用程序是否有用于机器人加入的机器人文件英寸。

缺点是 -

您需要确保要加入的机器人与 bots 目录中的 botfile 具有相同的名称。

关于javascript - 在运行时动态从文件加载函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52058298/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com