首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将变量传递给(全局?)导出类

将变量传递给(全局?)导出类
EN

Stack Overflow用户
提问于 2020-05-09 14:52:51
回答 1查看 48关注 0票数 0

如果这个问题没有真正的意义,我很抱歉--我可能对module.export的确切工作方式和类之间的范围缺乏一点了解,但我会尽力解释的。我目前有一个带有MusicPlayer类的音乐播放器的不和谐的机器人--这个类是以这种方式导出的:

代码语言:javascript
运行
复制
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();

我有各种与音乐相关的命令,这些命令导入这个音乐播放器如下:

代码语言:javascript
运行
复制
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吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-09 16:15:29

让我们列出几个要求:

  1. 您想要在一堆代码中共享一个音乐播放器。
  2. 您希望根据需要创建音乐播放器,只有当某人实际需要音乐播放器时,才需要使用代码

中的一些变量初始化音乐播放器。

要做到这一点,您必须集中创建音乐播放器,并且必须与具有要传递给构造函数的初始化变量的人进行协调。有很多方法可以做到这一点。我将举例说明其中的两个。

让我们假设,在创建音乐播放器时,您想要使用的变量是您的应用程序初始化代码。因此,与其让每个人自己加载音乐播放器模块,我们还会让他们向应用程序询问音乐播放器。

代码语言:javascript
运行
复制
// 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 };

然后,在任何希望访问共享音乐播放器的应用程序文件中,只需执行以下操作:

代码语言:javascript
运行
复制
const musicPlayer = require('./app.js').getMusicPlayer();

这要求任何使用共享musicPlayer的人都知道如何引用app.js。

另一种方法是让你的应用程序,初始化音乐播放器模块本身的一些初始状态,然后它可以使用时,它创建音乐播放器的需求。

代码语言:javascript
运行
复制
// 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 };

然后,在应用程序启动代码中,您可以这样做:

代码语言:javascript
运行
复制
require('./modules/musicplayer').configurePlayer(passMagicVariableHere); 

从那时起,任何人都可以做:

代码语言:javascript
运行
复制
const musicPlayer = require('./modules/musicplayer').getMusicPlayer();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61698677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档