[英]Singleton in RequireJS
我想使用RequireJS做一个简单的单例。
像这样:
// js/modules/singleton.js
define([], function () {
var Singleton = function() {
this.value = 10;
}
return new Singleton();
});
在主条目中,我有以下代码:
// main.js
require.config({
paths: {
singleton: 'js/modules/singleton'
},
shim: {
}
});
var o1 = require(["singleton"]);
var o2 = require(["singleton"]);
console.log(o1 === o2); // true
console.log(o1.value); // undefined (?!)
console.log(o2.value); // undefined (?!)
o1.value = 20;
console.log(o1.value); // 20
console.log(o2.value); // 20
o2.value = 30;
console.log(o1.value); // 30
console.log(o2.value); // 30
变量o1和o2正确指向相同的单例实例(o1 === o2),但是为什么未定义o1.value和o2.value ?
我希望这样的属性“值”为= 10,因为它是如此初始化的。
您的问题几乎是比赛条件。
一个简单的(同步!)调用就像
var o1 = require(["singleton"]);
如果模块先前已使用require()
的异步版本加载,则仅返回该模块。
因此,要解决您的问题,只需将代码包装在异步的require()
调用中,如下所示:
require( ['singleton'], function( singleton ){
o1 = singleton;
o2 = singleton;
console.log(o1 === o2); // true
console.log(o1.value); // 10
console.log(o2.value); // 10
o1.value = 20;
console.log(o1.value); // 20
console.log(o2.value); // 20
o2.value = 30;
console.log(o1.value); // 30
console.log(o2.value); // 30
});
引用RequireJS文档 (突出显示):
控制台调试:如果需要使用已通过JavaScript控制台中的
require(["module/name"], function(){})
调用加载的require(["module/name"], function(){})
,则可以使用仅使用的require()形式要获取它的模块的字符串名称:
require("module/name").callSomeFunction()
请注意,仅当先前通过require : 的异步版本加载了“模块/名称”时才有效 :
require(["module/name"])
。 如果使用相对路径,例如“ ./module/name”,则这些仅在内部定义
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.