1

Я испытывающие проблемы с RequireJS, где я не в состоянии экспорта набора функций, когда у меня есть требует заявления.RequireJS - Экспорт набора функций

Давайте предположим, что у меня есть файл с именем mySubFile.js, где первый мне нужно вводить JQuery, а затем другую зависимость. Предположим теперь, что у меня есть myFunction, и я хочу экспортировать его, чтобы получить вызов из другого файла.

define('mySubFile', ['jquery'], function ($) { 
    require(['dependency1'], function (dependency1) { 

     let myFunction = function(){ return "Hey There"; } 

     return : { 
        myFunction : myFunction 
     } 

    }); 
}); 

Теперь давайте предположим, что я хочу вызвать эту функцию из myFile.js:

define('myFile', ['jquery'], function ($) { 
    require(['mySubFile'], function (mySubFile) { 

     console.log(mySubFile.myFunction()); 

    }); 
}); 

Это не работает. Я получаю:

Невозможно прочитать свойство «myFunction» не определено.

С другой стороны, если я определяю mySubFile.js следующим образом:

define('mySubFile', ['jquery', 'dependency1'], function ($, dependency1) { 

    let myFunction = function(){ return "Hey There"; } 

    return : { 
       myFunction : myFunction 
    } 

}); 

я могу получить доступ к туРипсЫоп, но мне нужно сначала решить JQuery.

Я изо всех сил пытаюсь найти решение этого, но все еще ничего не нашел.

Как я могу решить это?

+0

Вы имеете в виду, что вам нужен jquery перед модулем mySubFile? – Nitesh

+0

@NiteshI нужно вставлять jQuery перед чем-либо еще. – AndreaM16

ответ

1

Учитывая код, который вы показать в вашем вопросе, это действительно путь:

define('mySubFile', ['jquery', 'dependency1'], function ($, dependency1) { 

Но вы не хотите использовать его, потому что:

может получить доступ к myFuncti на, но мне сначала нужно решить jQuery.

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

define('mySubFile', ['jquery'], function ($) { 
    require(['dependency1'], function (dependency1) { 

Вот что происходит:

  1. define выполняется вызов.RequireJS видит имя модуля (mySubFile), список зависимостей ['jquery'] и обратный вызов.
  2. RequireJS разрешает jquery и вызывает обратный вызов с ним.
  3. Выполняется вызов require. RequireJS видит список зависимостей и обратный вызов.
  4. RequireJS разрешает dependency1 и вызывает обратный вызов.

Здесь также необходимо решить jquery, прежде чем вы сможете что-либо вернуть. Наличие require внутри обратного вызова define ничего не меняет.

Получение require вызова внутри define для работы, как вы хотите, потребует значительного переписывания. Проблема, с которой вы сталкиваетесь, кстати, не специфична для RequireJS, а проблема, общая для всего асинхронного кода. См. this question для общей проблемы и подходов к ней.

+0

Спасибо за объяснение. Я знаю об асинхронном характере проблемы. Если мне кажется, что вы сказали в начале, у меня нет никаких * неопределенных * проблем, но мое приложение как-то распадается, так как я не разрешаю jquery. Я рассматриваю этот вопрос, который вы связали, но не можете найти способ разрешить jquery. Возможно, используя ** $ document (готов) **? – AndreaM16

+0

Мне непонятно, почему у вас проблемы. 'jquery' разрешается до вызова обратного вызова' define'. Если 'dependency1' * также * зависит от' jquery', тогда вы должны поместить 'jquery' в свой список зависимостей: либо в своем вызове' define', либо если это сторонний код, отличный от AMD, вы необходимо установить конфигурацию '' shim' в RequireJS ', которая отображает 'jquery' как зависимость. – Louis

+0

Например, прямо сейчас у меня есть проблема, когда я должен запускать заданную функцию, которая находится в другом файле js после ** $ (document) .ready **, но каким-то образом я получаю ** externalFile.thatFunction() ** undefined, так как externalFile, похоже, будет разрешен в то же время, что и jQuery. – AndreaM16

1

Если вы всегда должны Jquery быть доступны до вашего модуля, вы можете сделать это следующим образом:

define("mySubFile", function(require, exports, module){ 
    var a = require("jQuery"), // dependency 
     b = require("knockout"); // dependency 
    /* rest of the code for this module */ 

    let myFunction = function(){ return "Hey There"; } 

    return : { 
      myFunction : myFunction 
     } 
}); 
+0

Проблема не вызвана jQuery, и я уже могу получить ее доступной прежде всего. У меня возникла проблема с доступом к внешней функции из другого файла, когда этот подфайл имеет инструкцию require. – AndreaM16