RequireJS: имя модуля __ еще не загружено для контекста, но только для НЕКОТОРЫХ, а не для всех

Теперь я знаю, что этот вопрос задавали миллион раз, но я все еще не мог понять.

У меня огромное количество "определений" в разных файлах. В большинстве случаев это работает, но некоторые из моих модулей "не загружаются для контекста" иногда, несмотря на то, что я указал их имена в операторе "define".

===========================

Текущий код

index.js (упрощенный для StackOverflow)

require.config({
    baseUrl: '',
    paths: { 
    //TOOLS
        jquery: '../libraries/jquery-1.10.2.min',
        socketio:'socket.io/socket.io',
        jqueryLightBox:'../libraries/jquery.lightbox_me',
        jqueryMigrate:'../libraries/jquery-migrate-1.2.1',
        jqueryUI:'../libraries/jquery-ui-1.10.3.custom.min',
        spinner:'../libraries/jquery.spin',
        jQueryFormPlugin:'../libraries/jquery.form.min',
        jQueryCookiePlugin:'../libraries/jquery.cookie',
        json2:'../libraries/json2', 
        raphael:'../libraries/raphael-min', 
        raphaelPanZoom:'../libraries/raphael.pan-zoom.min',
        bootstrap: '../libraries/bootstrap.min',
        browserDetection: '../libraries/BrowserDetect',
        qtip: '../libraries/jquery.qtip.min',
        imagesloaded: '../libraries/imagesloaded.pkgd.min', 
        eventie: '../libraries/eventie',
        eventEmitter: '../libraries/EventEmitter.min',
        underscore: '../libraries/underscore-min',
        underscoreString: '../libraries/underscore.string.min',
        stacktrace: '../libraries/stacktrace',
        elapseMeMin: '../libraries/elapseMe.min',
        jqueryKeithWood: '../libraries/jquery.svg.min', 
        domReady: '../libraries/domReady',
    //PAGES: (Simplified for StackOverflow)
        TestView: '../javascripts/tests/TestView',
        TestModel: '../javascripts/tests/TestModel',
        TestController: '../javascripts/tests/TestController',
        TestPanelView: '../javascripts/tests/Test-StartPanelView',
        SocketLogic: '../javascripts/SocketLogic',
        Logger: '../javascripts/Logger',

    }, 
    shim: {
    'socketio': {
      exports: 'io'
                },
     'spinner': {
      exports: 'Spinner',
      deps: ['jquery']
                },
    'raphael':  {
     exports: 'Raphael',
      deps: ['jquery']
                },
    'raphaelPanZoom': {
      deps: ['raphael']
            },
    'bootstrap': {},
    'browserDetection':  {
      exports: 'BrowserDetect'
            },
    'underscore': {
      exports: '_'
                },
    'underscoreString': {
      deps: ['underscore'],
      exports: '_'
        },
     'stacktrace': {
      exports: 'printStackTrace'
        },
     'elapseMeMin': {
         exports: 'elapseMe',
         deps: ['jquery']
        }

    }
});

//////////////////
//1) Everything starts with this method. Will execute when the DOM is ready.
/////////////////

require(['domReady'], function (domReady) {
  domReady(function () {
    //This function is called once the DOM is ready.
    //It will be safe to query the DOM and manipulate
    //DOM nodes in this function.
    //Start Loading!
    require(['TestController'], function(TestController)
    {
        TestController.firstMethod();
    }); 
  });
});

TestController.js (упрощено для StackOverflow)

define(['TestModel', 'TestView', 'SocketLogic', 'Logger', 'TestPanelView'], 
function (TestModel, TestView, socketLogic, Logger, TestPanelView) 
{
 return {
    firstMethod: function()
    {
             TestModel.doSomething();
             TestView.doSomethingElse();
             socketLogic.andAnother();
             Logger.log("hi");
             TestPanelView.updateSomething();
             this.anotherMethod();
    },
    anotherMethod: function()
    {
             console.log("hello");
    }
    }
});

===========================

Проблема

Но время от времени я случайным образом получаю только для одного из них значение "не загружаться из-за контекста", хотя с остальными все в порядке:

Uncaught Error: Module name "TestPanelView" has not been loaded yet for context: _
http://requirejs.org/docs/errors.html#notloaded 

===========================

Текущие исправления

Исправление №1 — Использование require('');

Вместо

TestPanelView.updateSomething();

Я занимаюсь:

var testPanelView = require('TestPanelView');
testPanelView.updateSomething();

Что работает, НО… разве оно не должно быть уже загружено в контекст с тех пор, как я поместил его в заголовок? Почему этот? Он такой же, как и все остальные!

Исправление №2 — использование require([''],function(){});

Это тоже работает, но опять же, я просто делаю это один за другим, и это кажется неправильным!

Вместо

TestPanelView.updateSomething();

Иногда я делаю так:

require(['TestPanelView'], function(testPanelView){
      testPanelView.updateSomething();
});

Неудачные попытки №1

TestController.js (упрощено для StackOverflow)

define(['require', 'TestModel', 'TestView', 'SocketLogic', 'Logger', 'TestPanelView'], 
function (require) 
{
var TestModel = require('TestModel')
var TestView = require('TestView');
var SocketLogic = require('SocketLogic');
var Logger = require('Logger');
var TestPanelView = require('TestPanelView');
 return {
    firstMethod: function()
    {
             TestModel.doSomething();
             TestView.doSomethingElse();
             SocketLogic.andAnother();
             Logger.log("hi");
             TestPanelView.updateSomething();
             this.anotherMethod();
    },
    anotherMethod: function()
    {
             console.log("hello");
    }
    }
});

Здесь я снова получаю ошибку "not load for context", но на этот раз для всех из них.

===========================

Идеи?

Я вручную исправлял все, что находил, вот так, что происходит не со всеми, только с некоторыми здесь и там, что похоже на исправление обезьян... хотел бы знать, что я делаю неправильно здесь :( Кто-нибудь знает?

Примечание. Я использую RequireJS v.2.1.10.


person Katie    schedule 29.01.2014    source источник
comment
В коде, показанном в вопросе, нет ничего, что объясняет, почему вы получите... еще не загружен для контекста. Я прочитал код RequireJS и вижу, что единственная ситуация, в которой возникает эта ошибка, — это вызов типа var foo = require("...") (то есть вызов require с одним строковым аргументом) до загрузки требуемого модуля.   -  person Louis    schedule 30.01.2014
comment
хм. Ну, это отстой :( Я всегда удостоверяюсь, что модуль в заголовке, если я использую require("blah") в коде, я дважды и трижды проверял все свои файлы :( idk что это такое   -  person Katie    schedule 30.01.2014


Ответы (1)


Ответ на неудачную попытку №1

define(['require', 'TestModel', 'TestView', 'SocketLogic', 'Logger', 'TestPanelView'], 
function (require, testModel, testView, socketLogic, logger, testPanelView) {
    var firstMethod = function() {
             testModel.doSomething();
             testView.doSomethingElse();
             socketLogic.andAnother();
             logger.log("hi");
             testPanelView.updateSomething();
             this.anotherMethod();
    };
    var anotherMethod = function(){
        console.log("hello");
    }
 return {
    firstMethod: firstMethod,
    anotherMethod: anotherMethod
});

И не забывайте, открывающая фигурная скобка должна стоять после закрывающей круглой скобки функции в той же строке.

person Steven Spyrka    schedule 26.05.2014
comment
Это поставило меня в тупик. Мой модуль был структурирован таким образом, что он возвращал объект с некоторыми реквизитами функций, но функции были анонимными, определенными в литерале объекта в операторе return. Требуемый модуль постоянно находился undefined в одной из этих функций. Перемещение определений функций за пределы литерала возвращаемого объекта, похоже, исправило это... - person ajp15243; 14.07.2014