Подтвердить что ты не робот

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. Кто-нибудь может заметить, что я пропущу, пожалуйста?

4b9b3361

Ответ 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(), а не функцию, как предполагалось.