Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 什么时候是RequireJS';需要异步调用吗?什么时候是同步的?_Javascript_Asynchronous_Requirejs_Require - Fatal编程技术网

Javascript 什么时候是RequireJS';需要异步调用吗?什么时候是同步的?

Javascript 什么时候是RequireJS';需要异步调用吗?什么时候是同步的?,javascript,asynchronous,requirejs,require,Javascript,Asynchronous,Requirejs,Require,我使用RequireJS在我的一个项目中加载模块。 我在网上看到了使用require调用(而不是define)要求模块的不同方式 假设我有一个名为“JQuery”的模块,并且我需要它。 正如我在示例中看到的,有两种方法是可行的: 这: require(["JQuery"], function($){ $.doSomething(); }) 这是: var $ = require("JQuery"); $.doSomething(); 我的问题是,如果负载是异步的,正如Require

我使用RequireJS在我的一个项目中加载模块。 我在网上看到了使用
require
调用(而不是
define
)要求模块的不同方式

假设我有一个名为“JQuery”的模块,并且我需要它。 正如我在示例中看到的,有两种方法是可行的:

  • 这:

    require(["JQuery"], function($){
       $.doSomething();
    })
    
  • 这是:

    var $ = require("JQuery");
    $.doSomething();
    

  • 我的问题是,如果负载是异步的,正如RequireJS documantation所说的那样,第二个约定如何工作?如何确定已定义
    $
    ,并且第一行在第二行执行之前已完成

    根据require.js文档,它是一个包装器。因此,它正在重建异步工作的代码。它被称为CommonJs包装器。你可以找到更多关于它的信息

    我不知道requirejs。但我认为可以以
    sync
    async
    两种方式加载模块

    function require(name,cb){
        if(cb !== undefined){
            requireAsync(name,cb);
        }else{
            requireSync(name);
        }
    }
    

    RequireJS总是异步加载模块,但它允许一种看起来是同步的
    require
    。您的第二个代码段实际上缺少一些非常重要的代码。(另外,jQuery的模块名称被硬编码为
    jQuery
    。您可以编写一个配置,允许您将其称为
    jQuery
    ,但这没有意义。)这种形式的
    require
    调用设计用于模块内部,以便:

    define(function (require) {
        var $ = require("jquery");
        $.doSomething();
    });
    
    RequireJS对上述代码的作用是在执行之前将其转换为:

    define(['jquery'], function (require) {
        var $ = require("jquery");
        $.doSomething();
    });
    
    注意,
    define
    的第一个参数增加了依赖项。当RequireJS执行代码时,它会找到依赖项,加载
    jquery
    ,然后调用匿名函数。当遇到
    require(“jquery”)
    时,模块已经加载在一天结束时,
    require
    调用看起来是同步的,但它所需的模块加载仍然是异步的。

    您能否在
    define
    调用之外使用此同步表单
    require
    ?除非你对失败没有意见如果传递给它的模块尚未加载,则此
    require
    调用将失败。
    您将得到一个臭名昭著的错误:

    Module name ... has not been loaded yet for context: ...
    
    define
    中使用它是安全的,就像我上面所展示的那样。或者我想你可以:

    require(['jquery'], function (require) {
        var $ = require("jquery");
        $.doSomething();
    });
    

    这是可行的,但是手动重复依赖关系有什么意义呢。(如果你想知道,RequireJS不会像我在这里的例子中那样用回调转换
    require
    调用,就像我在上面展示的那样,它转换
    define
    调用。)

    谢谢。现在一切都清楚了,在我看来,代码在第二个方面看起来更漂亮、更干净了