我想使用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。
答案 0 :(得分:1)
你的问题几乎就是竞争条件。
简单(同步!)调用,如
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 documentation(突出显示已添加):
控制台调试:如果您需要使用模块 通过
require(["module/name"], function(){})
电话加载 JavaScript控制台,然后您可以使用刚才使用的require()表单 要获取它的模块的字符串名称:
require("module/name").callSomeFunction()
请注意,这仅适用于" module / name"以前是通过 异常版本的require :
require(["module/name"])
。如果使用 相对路径,如' ./ module / name',那些只在内部定义