Javascript 带有Web工作者的RequireJS Singleton
我正在使用最新的RequireJS创建一个Javascript项目。我定义了一个chessWorker模块,如下所示: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: "...",
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()代码>该函数可以通过其作用域访问实例
。这是因为闭包的存在。如果您需要了解闭包的更多信息,请阅读。感谢您的解释!