是否有理由嵌套需要函数调用?

时间:2014-10-19 01:43:18

标签: javascript requirejs

我的公司有一些现有的Javascript代码,看起来像这样。

require([pathA], function (A) {
    require([pathB], function (B) {
        // use A and B
    });
});

我被告知不要写下面的内容:

require([pathA, pathB], function (A, B) {
    // use A and B
});

这首先形成的问题是什么。我真的很想理解,因为有时候我可能有6个依赖项,而且我必须创建6个嵌套的require函数似乎有点奇怪!

3 个答案:

答案 0 :(得分:2)

嵌套需求调用是一种在异步设置中强制执行顺序的方法。 RequireJS异步加载模块,并且它们的加载/评估顺序是不确定的。如果出于某种原因需要B始终在A之后进行评估,那么当您确定B已加载时,您必须指示requirejs加载A即在相应的回调中。在大多数情况下,你会使用第二种形式而不关心加载/评估的顺序。

答案 1 :(得分:2)

artm所说的是正确的。第一个代码段中的顺序强制模块A在模块B之前加载。如果我被提供了类似的代码并被告知它不能像你的第二个代码片段那样重新排列,我的直接答案是“请提供具体原因”。

以下是我遇到的一些原因。为了完整起见,我将考虑与您在问题中显示的代码略有不同的案例。

  1. “我不想在任何地方都要求jQuery。所以我在加载应用程序之前需要它。”

    我认为这是糟糕的设计。如果某个模块在其他地方重用,则不一定非常明显需要jQuery。是的,你可以阅读代码,但我有一些模块,我从jQuery使用的唯一的东西是$.data,它远远落后于代码。很可能有人阅读代码会错过它。即使更明显,当人们担心依赖关系时,他们会扫描definerequire来电。

  2. “我需要在应用程序启动之前加载配置文件。”

    这通常是为了避免更糟糕,极其复杂或与嵌套要求一样糟糕的替代品。它是否是一个糟糕的设计实际上取决于手头的具体情况。

  3. 第二个模块是在第一个模块的基础上计算出来的。例如:

    require(["modA"], function (A) {
         var modB = modA.something();
         require([modB], function (B) {
             // use A and B
         });
    });
    

    请注意"modA"是一个文字,而modB是一个变量。有一些有效的用例场景。

  4. 更容易处理错误:

    require(["modA"], function (A) {
        require(["modB"], function (B) {
             ...
        }, function (err) {
             // I know if there's a problem here modB did not load properly..
        });
    });
    

    如果您使用相同的require加载了两个模块,您可能会分析错误以找出发生的情况。但是,分离模块使得知道如果错误处理程序被命中,那么modB没有正确加载就变得微不足道了。为什么我们可以检查modB是否正确加载而不是让整个应用程序失败?也许modB是一个可选模块,可以添加功能,但不一定可以让应用程序正常工作。错误处理程序可能设置状态标志或提供modB否则将提供的某种null实现。

答案 2 :(得分:0)

artm的答案是正确的。

嵌套的require调用意味着 B 依赖于 A 。它可能不适用,但请考虑在模块中指定:

// b.js
define([pathA], function (a) {});