带有 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
作为响应。
我正在使用最新的 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
作为响应。