![](/img/trans.png)
[英]Is it posiable to use exported variable in class in the same file its exported
[英]Passing a variable to a (globally?) exported class
如果這個問題沒有真正意義,我深表歉意 - 我可能對module.export
的工作原理和類之間的范圍缺乏了解,但我會盡力解釋。 我目前有一個 discord 機器人,其音樂播放器具有MusicPlayer
class - 此 class 以這種方式導出:
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
將被實例化。
如果您從不使用與音樂相關的命令,則永遠不會創建音樂播放器,因為 let musicplayer
let musicplayer = require('./modules/musicplayer');
永遠不會運行,對吧?
無論哪種方式,現在我需要從一個命令中將一些東西傳遞給音樂播放器構造函數,我怎樣才能以一種我不必重復執行類似操作的方式這樣做:let musicplayer
let musicplayer = require('./modules/musicplayer')(variable);
在每個需要音樂播放器的文件中? 有沒有辦法讓我聲明let musicplayer = require('./modules/musicplayer')(variable);
有一次,那個musicplayer
器會在整個代碼庫中使用嗎?
讓我們列出一些要求:
為了使這項工作,您必須集中創建音樂播放器,並且必須與擁有要傳遞給構造函數的初始化變量的任何人協調。 有很多方法可以做到這一點。 我將說明其中的兩個。
讓我們假設您的應用程序初始化代碼具有您想要在創建音樂播放器時使用的這個變量。 因此,與其讓每個人自己加載音樂播放器模塊,不如讓他們都向應用程序詢問音樂播放器。
// 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();
這要求任何使用共享音樂播放器的人都知道如何引用 app.js。
另一種方法是讓您的應用程序使用一些初始 state 初始化音樂播放器模塊本身,然后它可以在按需創建音樂播放器時使用。
// 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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.