什么时候需要'要求调用异步?什么时候同步?

时间:2015-02-05 10:20:05

标签: javascript asynchronous requirejs require

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

让我们假设我有一个名为“JQuery”的模块,我想要它。 正如我在示例中看到的那样,有两种方法可以:

  1. 此:

    require(["JQuery"], function($){
       $.doSomething();
    })
    
  2. 而且:

    var $ = require("JQuery");
    $.doSomething();
    
  3. 我的问题是,如果负载是异常的,就像RequireJS文档说的那样,第二个约定如何工作?我怎么能确定$已定义并且第一行在第二行执行之前完成了?

3 个答案:

答案 0 :(得分:11)

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

require

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

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

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

您可以在require("jquery")电话之外使用此同步表单require吗?只有你对失败感到满意。 如果传递给它的模块尚未加载,则此require调用将失败。您收到臭名昭着的错误:

define

在上面显示的require {I}中使用它是安全的。或者我想你可以做到:

Module name ... has not been loaded yet for context: ...
哪些工作但是手动重复依赖的重点是什么。 (如果你想知道,RequireJS 不会转换一个define调用,其回调类似于我在此示例中的回调,就像它将require(['jquery'], function (require) { var $ = require("jquery"); $.doSomething(); }); 调用转换为我已经在上面展示了。)

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我不知道requirejs。但我认为以syncasync方式加载模块是可能的。

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