如果这个问题没有真正的意义,我很抱歉--我可能对module.export
的确切工作方式和类之间的范围缺乏一点了解,但我会尽力解释的。我目前有一个带有MusicPlayer
类的音乐播放器的不和谐的机器人--这个类是以这种方式导出的:
const ytdl = require('ytdl-core-discord');
const MusicQueue = require('./musicqueue');
const discordUtils = require ('../../../utils/discord-utils');
class MusicPlayer {
constructor() {
this.repeat_playlist = false;
this.queue = new MusicQueue(); // this is the persistent queue for the server
this.dispatcher = null;
this.volume = 1;
this.stopped = true;
this.paused = false;
this.repeat_current_song = false;
this.auto_delete = false;
this.manual_index = false;
this.autodcEnabled = false;
}
....
}
module.exports = new MusicPlayer();
我有各种与音乐相关的命令,这些命令导入这个音乐播放器如下:
const { Command } = require('discord.js-commando');
const discordUtils = require ('../../utils/discord-utils');
let musicplayer = require(`./modules/musicplayer`);
module.exports = class TestCommand extends Command {
constructor(client) {
....
}
...
}
我的问题是,如何将局部变量传递给musicplayer
构造函数,因为我是通过module.exports = new MusicPlayer();
导出它的
我的理解是,使用module.exports = new MusicPlayer();
将允许我在整个项目中使用相同的musicplayer
对象(这正是我想要的);但是--这是我不确定我是否理解module.exports
工作方式的地方--不能保证(如果有的话)什么时候会实例化musicplayer
。
如果您从未使用过与音乐相关的命令,musicplayer
将永远不会被创建,因为let musicplayer = require('./modules/musicplayer');
永远不会运行,对吗?
无论是哪种方式,现在我都需要从其中一个命令中传递一些东西给musicplayer
构造函数,我如何才能这样做,而不必重复地在每个需要音乐播放器的文件中执行let musicplayer = require('./modules/musicplayer')(variable);
之类的操作?有什么方法可以让我一次声明let musicplayer = require('./modules/musicplayer')(variable);
并在整个代码库中使用musicplayer
吗?
发布于 2020-05-09 16:15:29
让我们列出几个要求:
中的一些变量初始化音乐播放器。
要做到这一点,您必须集中创建音乐播放器,并且必须与具有要传递给构造函数的初始化变量的人进行协调。有很多方法可以做到这一点。我将举例说明其中的两个。
让我们假设,在创建音乐播放器时,您想要使用的变量是您的应用程序初始化代码。因此,与其让每个人自己加载音乐播放器模块,我们还会让他们向应用程序询问音乐播放器。
// app.js
const MusicPlayer = require(`./modules/musicplayer`); // load module to get constructor
let musicPlayerInitVariable; // your code sets this during startup
const sharedPlayer;
function getMusicPlayer() {
if (!sharedPlayer) {
sharedPlayer = new MusicPlayer(musicPlayerInitVariable);
}
return sharedPlayer;
}
// one of many possible exports from your app
module.exports = { getMusicPlayer };
然后,在任何希望访问共享音乐播放器的应用程序文件中,只需执行以下操作:
const musicPlayer = require('./app.js').getMusicPlayer();
这要求任何使用共享musicPlayer的人都知道如何引用app.js。
另一种方法是让你的应用程序,初始化音乐播放器模块本身的一些初始状态,然后它可以使用时,它创建音乐播放器的需求。
// musicplayer.js
const ytdl = require('ytdl-core-discord');
const MusicQueue = require('./musicqueue');
const discordUtils = require ('../../../utils/discord-utils');
class MusicPlayer {
constructor() {
this.repeat_playlist = false;
this.queue = new MusicQueue(); // this is the persistent queue for the server
this.dispatcher = null;
this.volume = 1;
this.stopped = true;
this.paused = false;
this.repeat_current_song = false;
this.auto_delete = false;
this.manual_index = false;
this.autodcEnabled = false;
}
....
}
// this is the constructor variable
// You can either give it a default value so things will work if the player
// is not configured or if you don't give it a default value, then the code
// will require that configurePlayer() is called first
let musicPlayerInitVariable;
// call this before anyone calls getMusicPlayer()
function configurePlayer(data) {
// save this for later
musicPlayerInitVariable = data;
}
let sharedPlayer;
function getMusicPlayer() {
if (!sharedPlayer) {
if (!musicPlayerInitVariable) {
throw new Error('Music player must be configured with configurePlayer() first')
}
sharedPlayer = new MusicPlayer(musicPlayerInitVariable);
}
return sharedPlayer;
}
module.exports = { getMusicPlayer, configurePlayer };
然后,在应用程序启动代码中,您可以这样做:
require('./modules/musicplayer').configurePlayer(passMagicVariableHere);
从那时起,任何人都可以做:
const musicPlayer = require('./modules/musicplayer').getMusicPlayer();
https://stackoverflow.com/questions/61698677
复制相似问题