2

我是一名 ActionScript 3 开发人员,他刚刚开始尝试构建大型 JavaScript 应用程序。所以我理解模块并且理解 AMD 是一个很好的使用模式。我阅读了 RequireJS 并实现了它。但是,我仍然不明白的是如何实现跨模块通信。我知道应该有某种调解人......我阅读了文章和帖子,但仍然无法理解如何简单地实现它。这是我的代码,简化:

main.js

require(["Player", "AssetsManager"], function (player, manager) {
    player.loadXML();
});

播放器.js

define(function () {
    function parseXml(xml)
    {
        // NOW HERE IS THE PROBLEM -- how do I call AssetsManager from here???

        AssetsManager.queueDownload($(xml).find("prop").text());
    }

    return {
        loadXML: function () {
            //FUNCTION TO LOAD THE XML HERE, WHEN LOADED CALL parseXml(xml)
        }

    }

});

AssetsManager.js

define(function () {
    var arrDownloadQueue = [];

    return {
        queueDownload: function(path) {
            arrDownloadQueue.push(path);
        }
    }
});

任何“傻瓜”帮助将不胜感激:) 谢谢。

4

2 回答 2

1

要从您的另一个模块加载模块define(),您只需将第一个参数设置为一个数组,其中包含您的模块名称。因此,假设在您的代码中,您想要加载Player.jsAssetsManager.js中,您只需将字符串包含Player在数组中即可。

这是可能的,因为define的抽象实现等同于require,只是传递给的回调define期望返回一个值,并且它将添加一个“模块”到您可以加载的依赖项列表中。

AssetsManager.js

define(['Player'], function (player) {
    //... Your code.
});

但是,如果我可以添加它,我个人更喜欢使用require传递给回调的内部define来获取要加载的依赖项,而不是将参数传递给回调。

所以这是我的建议:

define(['Player'], function () {
    var player = require('Player');
});

这是因为它更符合CommonJS

这就是main.js格式化为对 CommonJS 更友好的样子:

require(["Player", "AssetsManager"], function () {
    var player = require('Player');
    var manager = require('AssetsManager');
    player.loadXML();
});

但是 CommonJS 的做事方式只是个人喜好。我这样做的理由是,您在数组中输入依赖项名称的顺序可能随时更改,我不想同时遍历数组和参数列表。

我的另一个理由(虽然,它只是迂腐),是我来自 Node.js 的世界,模块是通过require().

但这取决于你。

于 2012-07-16T05:36:11.643 回答
0

(这将是对skizeey答案的回复,但我对此没有足够的声誉)

在不通过 require 引入 Player 的 AssetManager 依赖项的情况下解决此问题的另一种方法是传递 main.js 已有的 AssetManager 实例。实现这一点的一种方法可能是让 Player 的 loadXML 函数接受一个 AssetManager 参数,然后将其传递给 parseXml,然后使用它。另一种方法可能是让 Player 拥有一个变量来保存由 parseXml 读取的 AssetManager。它可以直接设置,也可以使用将 AssetManager 存储在变量中的函数,例如 setAssetManager。后一种方式有一个额外的考虑 - 然后您需要在调用 loadXml 之前处理未设置该变量的情况。这个概念通常被称为“依赖注入”。

需要说明的是,我不建议使用 AMD 来加载它。我只是想为您提供更多选择;也许在解决另一个问题时,这种技术可能会更方便您,或者可能会帮助其他人。:)

于 2012-12-20T04:57:04.950 回答