繁体   English   中英

RequireJS中的Singleton

[英]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.valueo2.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM