2

我有以下模块配置:( Global -> Collections -> Favorites全局需要收藏,收藏需要收藏)。

同时Favorites还需要Global模块(针对它的其他属性)。

示例代码:

define("global", ["collections"], function(Collections) {
    console.log("Defining global");

    var Global = {
        env: "home",
        collections: Collections
    };

    return Global;
});
define("collections", ["favorites"], function(Favorites) {
    console.log("Defining collections");

    var collections = {
        likes: function() {},
        favorites: Favorites
    };

    return collections;
});
define("favorites", ["global"], function(Global) {
    console.log("Defining favorites");

    var Favorites = function(name) {
        console.log(Global.env)
        this.name = name;
    };
    return Favorites;
});

require(["global"], function(Global) {
    console.log("global", Global);
    console.log("collections", Global.collections);
    console.log("favorites", Global.collections.favorites);

    var Favorites = Global.collections.favorites;
    Favorites();
});

我还为这种情况创建了 jsfiddle:http: //jsfiddle.net/NBSzC/

正如你所看到的,当我们试图envundefined.

在 StackOverflow 上,在同一案例中还有其他有用的票证:如何使用 RequireJS/AMD 处理循环依赖项?

使用它我可以让它“工作”,请检查以下小提琴:http: //jsfiddle.net/NBSzC/1/

这里的问题是我不得不使用

console.log(Global.Global.env)

因为原来的 Global 现在指向 export 对象,我们已经将 Global 的链接设置为 Global。

我们也可以在 Global 模块中进行以下操作,但我相信这是另一个 hack:

_.extend( exports, Global );

在相应的链接中根本没有这样的问题,不知道我做错了什么。

4

1 回答 1

1

我觉得循环依赖是代码组织遭受的“气味”。

在您的情况下,我认为您不需要全局变量中的collections字段。如果某些东西依赖于集合,为什么不直接询问集合模块呢?

在这种情况下,依赖关系将是:Collections → Favorites → Globals(但 Globals 不指向收藏夹,因此圆圈被打破)。

然后,如果您真的需要从头开始加载所有内容,您可以修改require()调用:

require(["global","collections"], function(Global,Collections) { ...

或者定义一个需要所有内容的引导模块并要求:

define("bootstrap",["global","collections","favorites"], function(...) { ...
require("bootstrap", ...)

当然我没有你项目的所有细节,所以解决方案可能会有所不同。但主要的一点是循环依赖是一种气味。

于 2013-10-11T07:03:27.390 回答