3

我正在尝试在RequireJS中编写一个插件,该插件将在每次调用时创建一个对象的实例。

对于(人为的)示例:

define("loader", {
  load: function(name, req, onload, config) {
    var instance = GlobalGetter.get(name);
    instance.id = new Date().getTime() * Math.random();
    onload(instance);
  }
});

require(["loader!goo"], function(instance) {
  console.log(instance.id); // 12345
});

require(["loader!goo"], function(instance) {
  console.log(instance.id); // 12345 SAME!
});

在这种情况下,“ goo”只加载一次,因此两个 require 回调都传递了相同的对象实例。当您考虑 RequireJS 试图解决的问题时,这是完全可以理解的,但这不是我所需要的。

是否可以将插件配置为永远不会返回缓存结果?除了这个用例之外,RequireJS 完全符合我的需求。有没有(非)官方的方式来获得我正在寻找的行为?

谢谢。

4

2 回答 2

4

为了说明我的方法,您甚至不需要插件,只需定义一个像这样的构造函数

define( {
  'getInstance': function(){
    var instance = new Object(); // init the object you need here
    instance.id = 42; // some more dynamic id creation here
    return instance;
  }
} );

然后您的实际通话将如下所示:

require(["loader!goo"], function(constructor) {
  var instance = constructor.getInstance();
  console.log(instance.id);
});
于 2013-08-19T18:39:45.793 回答
0

所以我已经弄清楚了,但我肯定是在尝试错误地使用 RequireJS 插件。

此解决方案与插件的预期行为背道而驰,因此您可能不应该这样做。话虽如此,这就是我实现多个实例化的方式:

define("loader", {
  load: function(name, req, onload, config) {
    // Strip out the randomizer
    name = name.substring(0, name.indexOf("?"));

    // Logic you want repeated each time
    var fn = Something.GetClass(name);
    var instance = new fn();
    instance.id = Math.random();
    onload(instance);
  },
  normalize: function(name, normalize) {
    return name + "?" + Math.random();
  }
});

require("loader!goo", function(instance) {
  console.log(instance.id); // 123
});

require("loader!goo", function(instance) {
  console.log(instance.id); // 456
});
于 2013-08-19T20:40:33.487 回答