Undefined объект передается через Requirejs
Я использую 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
параметр demographics
, переданный через конфигурацию define
, равен undefined
. Выход из консоли говорит мне, что "демография === undefined" - true
.
Однако, когда файл main.js выполняется, передаваемый ему параметр демографии не является undefined, он, как и ожидалось, представляет собой экземпляр объекта.
Теперь я застрял, так как не могу понять, почему в Complaints.js
эта демографическая переменная undefined. Кто-нибудь может заметить, что я пропущу, пожалуйста?
Ответы
Ответ 1
У вас есть круговая зависимость. Модуль demographics
зависит от complaints
, а complaints
зависит от demographics
. Согласно документации :
Если вы определяете циклическую зависимость (потребности b и b нужны a), тогда в этом случае, когда вызывается функция b module, она получит значение undefined для a.
Решение, если вы не можете удалить циклическую зависимость, заключается в асинхронном требовании одного из двух модулей внутри другого по запросу (скажем, когда создается представление, а не когда выполняется модуль, определяющий представление). Опять же, docs достаточно хорошо освещают эту тему.
Ответ 2
Другой случай - когда вы случайно набираете require
вместо define
при определении модуля, мне понадобилось некоторое время, чтобы заметить это.
Ответ 3
У меня была аналогичная проблема. В моем случае, определяя модуль, я написал:
define('some_dependency', ...
вместо
define(['some_dependency'], ...
Ответ 4
Еще одна возможная причина заключается в реализации интерфейса модуля (AMD, CommonJS), но забывая вернуть что-либо. Я просто сделал это.
Ответ 5
Еще одна возможная причина, которая может показаться очевидной в ретроспективе, - это ошибка в коде модуля. В моем случае я пытался получить атрибут из переменной undefined. Ошибка записывается в консоль, но по какой-то причине я не видел ее/не принимал ее для ошибки модуля undefined.
Ответ 6
Я только что столкнулся с другой причиной:
define(function () {
return {};
}()); // <-- notice the '()' typo.
Эта "опечатка" не вызывает ошибок JS для этого и может сбить с толку, особенно в сложном приложении со многими потенциальными круговыми зависимостями.
Причиной, разумеется, является "опечатка", которая просто вызывает функцию, которую вы определяете, передавая ее результат define()
, а не функцию, как предполагалось.