Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 带有Web工作者的RequireJS Singleton_Javascript_Jquery_Requirejs - Fatal编程技术网

Javascript 带有Web工作者的RequireJS Singleton

Javascript 带有Web工作者的RequireJS Singleton,javascript,jquery,requirejs,Javascript,Jquery,Requirejs,我正在使用最新的RequireJS创建一个Javascript项目。我定义了一个chessWorker模块,如下所示: var worker; define("chessWorker", ["jquery", "messageListener"], function($, listener) { if (worker) { return worker; } else { $.ajax({ url: "...",

我正在使用最新的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;
            }
        });
    }
});

这是坏习惯吗?如果是这样,我应该如何定义它?关于如何定义单身人士,是否有任何标准?

工作者定义为一个全球工作者并不真正建议您使用闭包:

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
作为响应。

它有效吗?你认为哪一部分是坏习惯?你到底打算怎么做?@Anko在我看来,在define方法之外定义worker是一种非常糟糕的做法,但我不知道我应该怎么做?如果你使用requirejs来构建你的项目!为什么您需要define方法之外的
var worker
?我不明白这种方法,每次我需要模块时,实例都被设置为null?当您第一次需要
chessWorker
时,require.js将执行您的模块代码并记住返回值。下次您请求模块时,它将不再执行模块代码,因此行
var instance=null
将不被执行。您可以在上面看到singleton实现的演示,那么这是否意味着一切都是singleton?不,my中的模块正在返回
实例
,但不是直接返回(返回实例)。我们正在使用一个函数访问变量
return MySingleton.getInstance()该函数可以通过其作用域访问
实例
。这是因为闭包的存在。如果您需要了解闭包的更多信息,请阅读。感谢您的解释!