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 
    } 

}); 

我可以访问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必须先解决,然后才能返回任何内容。在define回调中有一个require不会改变任何事情。

define内部拨打require呼叫以按照您希望的方式工作将需要大量重写。顺便说一句,你在那里碰到的问题并不是特定于RequireJS,而是所有异步代码都有的共同问题。请参阅this question了解常见问题及其解决方法。

+0

感谢您的解释。我意识到问题的异步性。如果我喜欢你刚才说的我没有任何* undefined *的问题,但我的应用程序只是打破了某种方式,因为我没有先解决jquery。我正在看看你已经链接的问题,但无法找到解决jQuery问题的方法。也许使用** $文件(准备好)**? – AndreaM16

+0

我不清楚你为什么会遇到问题。在调用'define'的回调函数之前解析'jquery'。如果'dependency1' *也*依赖于'jquery',那么你需要将'jquery'放入它的依赖关系列表中:要么在define调用中,要么它是第三方非AMD代码段,需要在RequireJS配置中设置一个'shim',将'jquery'列为依赖项。 – Louis

+0

例如,现在我有一个问题,我必须触发一个给定的函数,该函数位于** $(document).ready **之后的另一个js文件中,但不知何故我得到了** externalFile.thatFunction()**未定义,因为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