RequireJS 啥时候需要异步调用?啥时候同步?

Posted

技术标签:

【中文标题】RequireJS 啥时候需要异步调用?啥时候同步?【英文标题】:When is RequireJS' require call asynchronous? When is it synchronous?RequireJS 什么时候需要异步调用?什么时候同步? 【发布时间】:2015-04-05 03:44:57 【问题描述】:

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

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

    这个:

    require(["JQuery"], function($)
       $.doSomething();
    )
    

    还有这个:

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

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

【问题讨论】:

【参考方案1】:

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

define(function (require) 
    var $ = require("jquery");
    $.doSomething();
);

RequireJS 对上面的代码所做的是在执行之前将其转换为 this:

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();
);

which would 工作,但是手动重复依赖有什么意义。 (如果您想知道,RequireJS 不会使用回调转换 require 调用,就像我在此处的示例中使用的那样,它转换 define 调用的方式与我展示的一样以上。)

【讨论】:

谢谢。现在一切都清楚了,在我看来,第二种方式的代码看起来更好更干净。 :)【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于RequireJS 啥时候需要异步调用?啥时候同步?的主要内容,如果未能解决你的问题,请参考以下文章

java中异步处理和同步处理分别是啥意思?

c# 异步处理啥意思?

java中异步处理和同步处理分别是啥意思

java异步方法啥意思

我啥时候需要将异步函数的返回类型声明为未来对象?

RequireJS中的define和require有啥区别? [复制]