javascript - RequireJS 的 require 调用什么时候是异步的?什么时候同步?

标签 javascript asynchronous requirejs require

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

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

  1. 这个:

    require(["JQuery"], function($){
       $.doSomething();
    })
    
  2. 还有这个:

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

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

最佳答案

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 如上所示调用。)

关于javascript - RequireJS 的 require 调用什么时候是异步的?什么时候同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28341390/

相关文章:

javascript - DOM 的点击事件不起作用,而异步函数正在文档就绪中执行

javascript - 如何编写正则表达式进行日期格式验证?

multithreading - Flutter 插件异步和线程

vb.net - .Net 异步委托(delegate)中止

javascript - 如何使用 RequireJS、grunt 和 uglify 在我的应用程序代码中组合 CKEditor?

javascript - RequireJS 单个文件中的多个模块

javascript - 在 JavaScript 数组中存储 DOM 元素引用。为什么我不能重用存储的引用来添加 eventListener?

javascript - 如何编辑悬停时对象的样式?

c# - ASP.NET Web API C# 并发请求导致数据库重复

javascript - 无法使用 TypeScript 和 Require.JS 引用对象