繁体   English   中英

Dojo AMD加载器是否确保模块只执行一次?

[英]Does Dojo AMD loader ensure modules are executed only once?

在一些现有的基于Dojo的应用程序中,我看到一个模块使用表单的单例模式:

define([...], function(...) {
  var MyClass = declare(...);
  if (!_instance) {
    var _instance = new MyClass();
  }
  return _instance;
});

但如果我正确理解AMD,则不需要使用_instance,因为传递给define(...)调用的函数应该只执行一次......或者可能不执行?

我对AMD加载器的理解是,当通过调用“require”或“define”获取模块时,它将检查模块是否已经加载。 如果尚未加载,它将加载JS,执行传递给“define”的函数,并在内部存储返回的值。 如果已经加载,它将只返回先前存储的值。

我的假设是否正确? 如果是这样,在编写模块时,我们可以安全地假设给定的模块只会被加载并执行一次,我们不需要执行任何检查以查看是否已经初始化了某些内容,从而使代码更简单。

谢谢。

你是对的,但并不完全

define("my.widget", [ "dojo/_base/declare",.... ], function(declare, ...){
    return declare("my.widget", [ .. ], {
        value : "myvalue"
    });
});

这里我们定义了定义类的模块,因此当需要模块时,类声明(构造函数)被缓存,这意味着类只定义一次。 但这并不意味着你可以将它用作静态,因为那只是类声明,而不是实例。

这不起作用:

require(["my.widget"], function(widget) {
    console.log(widget.value);
});

这是正确的用法:

require(["my.widget"], function(widget) {
    console.log(new widget().value);
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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