RequireJS中的单身人士

时间:2015-01-14 11:19:17

标签: javascript 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。

1 个答案:

答案 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
});

Example Fiddle

  

引用RequireJS documentation(突出显示已添加):

     

控制台调试:如果您需要使用模块   通过require(["module/name"], function(){})电话加载   JavaScript控制台,然后您可以使用刚才使用的require()表单   要获取它的模块的字符串名称:

     

require("module/name").callSomeFunction()

     

请注意,这仅适用于" module / name"以前是通过   异常版本的require require(["module/name"])。如果使用   相对路径,如' ./ module / name',那些只在内部定义