带有 Web Worker 的 RequireJS 单例

RequireJS Singleton with Web Workers

我正在使用最新的 RequireJS 创建一个 Javascript 项目。我正在这样定义一个 chessWorker 模块:

var worker;

define("chessWorker", ["jquery", "messageListener"], function($, listener) {
    if (worker) {
        return worker;
    } else {
        $.ajax({
            url: "...",
            success: function(data) {
                worker = new Worker(window.URL.createObjectURL(new window.Blob([data])));

                worker.onmessage = listener

                worker.error = function(e) {
                    ...
                };

                return worker;
            }
        });
    }
});

这是不好的做法吗?如果是这样,我应该如何定义呢?关于如何定义单例,是否有关于单例的标准?

不建议将 worker 定义为全局变量,您应该改用闭包:

define(function(){
    var instance = null;

    function MySingleton(){
        if(instance !== null){
            throw new Error("Cannot instantiate more than one MySingleton, use MySingleton.getInstance()");
        } 

        this.initialize();
    }
    MySingleton.prototype = {
        initialize: function(){
            // summary:
            //      Initializes the singleton.

            this.foo = 0;
            this.bar = 1;
        }
    };
    MySingleton.getInstance = function(){
        // summary:
        //      Gets an instance of the singleton. It is better to use 
        if(instance === null){
            instance = new MySingleton();
        }
        return instance;
    };

    return MySingleton.getInstance();
});

注意:还要确保您的 ajax 调用是同步的,或者当您需要 chessWorker 模块时,您将得到 null 作为响应。