【问题标题】:Undefined object being passed via Requirejs通过 Requirejs 传递的未定义对象
【发布时间】:2012-08-16 16:02:27
【问题描述】:

我正在使用Requirejs 在我们的网络应用程序中加载 JavaScript。问题是我得到一个 undefined 对象被传递给一个模块,当在其他模块中使用时,它被实例化得很好。

好的,这是设置。我的 main.js 文件在启动时运行 requirejs:

require.config({
    baseUrl: "/scripts",
    paths: {
        demographics: "Demographics/demographics",
        complaints: "Complaints/complaints",
    }
});

require(["templates", "demographics", "complaints", "crossDomain"], function (templates, demographics, complaints) {
    "use strict";

    console.log("0");
    console.log(demographics === undefined);

    demographics.View.display();
});

很多配置已经被剥离到这个问题中的核心文件。

这里是Demographics.js:

define(["ko", "templates", "complaints", "globals", "underscore"], function (ko, templates, complaints, globals) {

    // Stuff removed.
    return {
        View: view
    };
});

和Complaints.js

define([
    "demographics",
    "ko",
    "templates",
    "complaints",
    "visualeffects",
    "globals",
    "webservice",
    "underscore",
    "typewatcher",
    "imagesloaded"],
    function (demographics, ko, templates, complaints, visualeffects, globals, webservice) {
        "use strict";


        console.log("1");
        console.log(demographics === undefined);
    return {
        View: view
    };
});

问题在于 - 在Complaints.js 中,通过define 配置传递的demographics 参数是undefined。控制台注销告诉我“人口统计 === 未定义”是 true。

但是,当 main.js 文件执行时,传递给它的人口统计参数不是未定义的,正如预期的那样,它是一个实例化的对象。

现在我被困住了,因为我不明白为什么在 complaints.js 中人口统计变量是未定义的。谁能发现我错过了什么?

【问题讨论】:

    标签: javascript requirejs


    【解决方案1】:

    我遇到了类似的问题。就我而言,在定义模块时,我写了:

    define('some_dependency', ...
    

    而不是

    define(['some_dependency'], ...
    

    【讨论】:

      【解决方案2】:

      你有一个循环依赖。 demographics 模块依赖于complaints,而complaints 依赖于demographics。根据documentation:

      如果你定义了一个循环依赖(a需要b,b需要a),那么在这种情况下,当b的模块函数被调用时,它会得到a的未定义值。

      如果您不能删除循环依赖,解决方案是按需异步要求另一个模块中的两个模块之一(例如,在实例化视图时,而不是在执行定义视图的模块时)。同样,docs 很好地涵盖了这个主题。

      【讨论】:

      • 啊,这正是我所怀疑的,但真的没想到会发生这种情况(我是 AMD/requirejs 的真正新手 :) 我的行动计划是创建另一个模块,它将托管人口统计数据和投诉的代码。这意味着这个新模块将用于调用其他两个文件中的代码。感谢您确认我的想法。有时间会试一试的。
      【解决方案3】:

      我刚刚遇到另一个原因:

      define(function () {
          return {};
      }()); // <-- notice the '()' typo.
      

      这个“错字”不会导致这个错误的 JS 错误,尤其是在具有许多潜在循环依赖的复杂应用程序中,可能会让人难以理解。

      当然,原因是“错字”是有效的 JS,它只是调用您定义的函数,从而将其结果传递给 define(),而不是预期的函数。

      【讨论】:

        【解决方案4】:

        另一种情况是,当您在定义模块时不小心输入了require 而不是define,我花了一些时间才注意到这一点。

        【讨论】:

          【解决方案5】:

          另一个可能的原因是实现了模块的接口(AMD、CommonJS),但忘记返回任何内容。我就是这么做的。

          【讨论】:

            【解决方案6】:

            事后看来可能很明显的另一个可能原因是模块代码中的错误。就我而言,我试图从未定义的变量中获取属性。该错误已记录在控制台中,但由于某种原因我没有看到它/将其误认为是未定义的模块错误。

            【讨论】:

              猜你喜欢
              • 2018-12-30
              • 2021-12-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-06-22
              • 2019-09-17
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多