Creating a Singular Instance for Dynamically Loaded Module in Next.js

I'm currently working on creating a Singleton instance for a dynamically imported module in my Next.js app. However, the problem is that each time I call getInstance, it initializes a new instance instead of reusing the existing one.

The following code snippet in gui.js displays the implementation:

let loadDynamicModule = async () => {
    let GUI;

    await import('three/examples/jsm/libs/dat.gui.module.js')

    .then(module => {
        GUI = module.GUI
    })
    .catch(e => console.log(e))

    return GUI;
}

let GUI = (function () {
    let instance;

    return {
        getInstance: async () => {
            if (!instance) {
                let GUIModule = await loadDynamicModule();
                instance = new GUIModule();
            }

            return instance;
        }
    };
})();

export default GUI;

To utilize this function within an ES6 class method, you can use

GUI.getInstance().then(g => { ... })

In typical scenarios, React Context API or Redux would be used for managing shared state. However, in this specific case, the requirement is to stick with pure ES6 JavaScript without relying on React.

Answer №1

It's crucial to cache the promise rather than the instance itself; otherwise, there may be attempts to import the module and create another instance while the initial one is still loading and hasn't assigned the instance variable yet.

async function createInstance() {
    const module = await import('three/examples/jsm/libs/dat.gui.module.js')

    const { GUI } = module;

    return new GUI();
}

let instancePromise = null;

export default function getInstance() {
    if (!instancePromise) {
        instancePromise = createInstance()
        // .catch(e => {
        //    console.log(e); return ???;
        //    instancePromise = null; throw e;
        // });
    }
    return instancePromise;
}

Similar questions

If you have not found the answer to your question or you are interested in this topic, then look at other similar questions below or use the search

Troubleshooting issues with ember-data's belongsTo relationship

I am facing an issue with the model I have: Whenever I make a call to this.store.find('history'); A request is sent to http:://www.example.com/api/histories/ and I receive the following JSON response: { "tracks":[ { "id":83, ...

The issue of Headless UI Transition not functioning properly in conjunction with Dialog components

I have encountered an issue with the transition effect in my Next.js 13 project using Headless UI. The transition effect seems to work only when the element leaves, but not when it enters. I am unsure if this is a bug in the code or if I am missing somethi ...

Run a function upon clicking a button in JavaScript

Could someone please help me figure out what I am doing incorrectly in the code below? I am attempting to trigger a function when a button is clicked. The HTML: <button id="btn1">Press me!</button> <input type="button" id="btn2" value="Pr ...

watchWebpack is compiling all the files

As per the webpack documentation on watching files webpack can keep an eye on files and recompile them whenever there are changes. My understanding is that this implies webpack will only compile the files that have been modified. I have a configuratio ...

Having trouble getting Material-UI classes to work with external SVG icons?

I recently crafted a Material-UI persistent drawer that contains a list item component designed to alter the icon color upon user interaction. However, my styling adjustments only seem to apply to Material-UI icons and not external SVG ones. If you'r ...

Creating ellipses using Three.js with a specified list of points

Currently, I am working on a solar system model using Three.js. I have a function that calculates the position of the planet based on the day, but I am struggling to draw the correct elliptical orbit for the planet using a list of points generated from tha ...

Securing your Angular2 application with TypeScript for enhanced safety

Looking to create a web application using Angular2 with TypeScript. After researching authentication in Angular2, it seems I need to include the following components: index component (public) login component (public) my private component (private) Thes ...

Choosing the perfect item with the help of a material's GridList

I've developed a react-mobx application using Material-UI, and the code structure is similar to this: render() { // defining some constants return ( <div> <img src={selectedPhoto} alt={'image title'} /> < ...

Choosing an option in react-select causes the page to unexpectedly shift

Encountering a problem with a mobile modal developed using react-select. The selectors are within a div with fixed height and overflow-y: scroll. Upon selecting an option for the 'Choose observer' select, the entire modal briefly jumps down in th ...

How to Implement a Loop Inside a JavaScript Alert or Prompt?

Seeking clarity: Is it possible to embed code into an alert() or prompt()? For example, is there a way to include a loop or add data to the alert() or prompt just before execution or during execution? -Appreciate any help ...

Creating dropdown options within a DataGrid in Form.IO: A step-by-step guide

I'm currently working with the Form.IO JS library to develop a new form. Within this form, I need to include a DataGrid containing 11 components. To ensure all components fit inline, I have applied the CSS rule overflow: auto (overflow-x: auto; overfl ...

Preserve a data point without causing any alterations

I am working with a device that continuously sends values until it is stopped. These values are then saved inside an array. deviceMonitoring( device2 ){ // In this function, I populate the arrayTimestamp and then copy the first value. this.arrayElement = t ...

Show popup window during servlet processing

I'm attempting to display a modal box in a Java servlet with the message "Please wait while your request is processed". I understand that I can make an AJAX call and manage the modal in the front-end code. Currently, I trigger the servlet when the us ...

Executing a query with a `has many` relationship in MongoDB: Step-by-step guide

In my setup with Node, Express, and backbone, I am successfully retrieving records from MongoDB collections using simple queries. However, I am struggling to understand how to query more complex data, such as the one below: db.employees.aggregate( [ ...

Error encountered while parsing Node.js code for MySQL query execution

I am encountering an error message from Node that reads: Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TIMESTAMPDIFF(second, entered_at, c ...

Tips for modifying animations based on screen width thresholds

Currently, I've implemented the data-aos attribute to add a "fade-up-right" animation to an element on my website, as shown below: <div className="des__Container" data-aos="fade-up-right"> However, I now want to modify this ...

jQuery ajaxSetup: handling error retries for ajax calls is not possible

When using $.ajaxSetup(), I am faced with the challenge of making an AJAX request after refreshing a valid token in case the previous token has expired. The issue arises when attempting to execute $.ajax(this) within the error callback. $.ajax({ url: ...

Ending JavaScript promises

I am currently utilizing the Google JS closure library which can be found at https://developers.google.com/closure/library/ Below is the code snippet that I have: if (endDate >= wap.com.ifx.util.IfxComponentUtil.yyyymmdd(currentDate) && goog.o ...

How to access a global jquery function variable inside a foreach loop

Is there a way to modify the value of a global jQuery variable inside a foreach loop each time a new model item is encountered? I am looking to update the calendar with new dates but I need access to certain functions within the foreach loop to achieve thi ...

The HTTPOnly cookie is not accessible within the getServerSideProps function in Next.js

Why isn't the jid cookie available in getServerSideProps using Next JS? Here's the scenario: https://i.stack.imgur.com/FLRGk.png The jid cookie is generated by an Expressjs API at https://api-dev.example.com. I'm attempting to retrieve thi ...