Javascript 如何使用curl.js加载对象?

Javascript 如何使用curl.js加载对象?,javascript,module,requirejs,amd,curl.js,Javascript,Module,Requirejs,Amd,Curl.js,我从这里获得了一些AMD/CommonJS适配器代码: 我希望使用该代码使我的所有代码与AMD/CommonJS兼容。我希望能够做到的是: greeter = curl(['modXyz']); greeter.sayHi("Gracie"); 但是curl返回的对象不是我期望的对象。我能得到的最接近的结果是: curl(['modXyz'], function(mod) { window.greeter = mod; }); greeter.sayHi("Gracie"); 这似乎

我从这里获得了一些AMD/CommonJS适配器代码:

我希望使用该代码使我的所有代码与AMD/CommonJS兼容。我希望能够做到的是:

greeter = curl(['modXyz']); 
greeter.sayHi("Gracie"); 
但是
curl
返回的对象不是我期望的对象。我能得到的最接近的结果是:

curl(['modXyz'], function(mod) { window.greeter = mod; }); 
greeter.sayHi("Gracie");

这似乎违背了AMD的目的。curl能做这样的事情吗?我必须使用它来实现它吗

curl函数是异步的,并返回一个承诺。因此,您只能通过传递给curl的回调或传递给当时的回调(在承诺实现后调用)来获得结果

curl(['dep1', 'dep2', 'dep3' /* etc */], callback);


CurlJS和RequireJS都支持AMDCommonJS需要调用模式:

require(['name'], callbackFunction)
CJS和AMD之间的区别在于使用数组作为依赖项列表的包装器。还请注意,在CurlJS的配置中,您可以将
curl
别名为
require
,以使代码与AMD规范完全兼容。请注意:

CJS需要呼叫模式:

var a = require('name')
var promise = require(['name'])
promise.then(callbackFunction)
需要调用模式:

var a = require('name')
var promise = require(['name'])
promise.then(callbackFunction)
这通常可以缩短为:

require(['name']).then(callbackFunction)
注意,CurlJS返回Promise对象不是AMD规范的一部分。AMD规范似乎没有规定AMD样式require调用的返回值

RequireJS和CurlJS都支持标准AMD要求调用模式:

require(['name'], callbackFunction)
再次,请注意使用数组作为标志,这是AMD风格的要求。这会触发不同的返回值逻辑

要使您的东西按您的意愿工作,在CurlJS上,您的代码必须位于一个模块内,该模块被包装为一个CommonJS模块,请使用:

define(function(require) { ... });
我被告知,在这种情况下,
require
的行为类似于CommonJS style
require
-sync。实际上,在幕后发生的事情是加载程序扫描工厂函数,查找您需要的内容,并将其折叠到该定义的需求列表中。然后,在工厂内部,您可以执行以下操作:

var greeter = require('modXyz'); 
greeter.sayHi("Gracie");
请注意,“同步”行为仍然是一种错觉,因为实际发生的情况是检测到的所需资源已预加载

在RequireJS上,即使是全局的
require
也可以称为CJS样式:
var resource=require('resource/path')
,但只有在您之前已经加载它之后才可以


换句话说,在工厂函数运行之前,CurlJS和RequireJS中的加载总是异步进行的,但在RequireJS中,您几乎可以在任何地方使用它,而在CurlJS中,这是一个非常小的场景。

因为浏览器远离其资源,所以它必须在获取这些资源时阻塞主线程,或者必须异步获取它们。因为我们不应该阻止主线程(有效地使浏览器无响应),所以我们必须异步获取资源。(这与任何AMD加载程序、RequireJS、dojo等都是一样的。)

因此,像下面这样的事情是行不通的:

var foo = require('lib/foo');
好吧,它不能在浏览器中通常使用的全局ish空间中工作。但是,它可以在受控环境中工作,例如在AMD模块中

步骤1:在模块内部编写代码。

<script src="lib/curl/src/curl.js"><script>
<script src="myapp/run.js"><script>
步骤2:编写引导模块以启动应用程序。

<script src="lib/curl/src/curl.js"><script>
<script src="myapp/run.js"><script>
“myapp/main”可能看起来像这样:

define(function (require) {
    var view1 = require('myapp/view1/controller');
    view1.render();
    view1.placeAt('body');
});
主模块(或任何AMD模块)内部,则
require
的行为更像我认为您所期望的。请注意,这是一个特殊的AMD签名。您不能在
define
中指定依赖项,也不能期望
require
的行为像这样。您只能以一种方式指定依赖项。这将不起作用:

define(['myapp/view1'], function (view1) {
    var foo = require('foo');
});
希望这有帮助


--John

Hmm,这似乎与require的实现方式有点不同。如果我想在回调之外使用结果对象,是否必须将其附加到窗口?我尝试在回调中返回结果,但没有效果。这与require无关,但与curl.js的实现方式有关。您最好使用同步varian例如jQuery.ajax的async设置为false。这让我更加困惑。require.js似乎不是同步的。require.js只加载代码。一旦加载了代码并且您可以执行它,require.js就不再涉及了。然后,问题只在于如何使用curl。完全不相关的.curl.js和RequireJS都有glo异步BAL。一旦您进入AMD包装的CJS模块或已列出其依赖项的经典AMD模块,本地
require
变量就可以用于同步。(注意“全局”和“本地”之间的差异。)非常彻底的响应,谢谢。我在OP中对此进行了一些说明:“但是curl返回的对象不是我期望的对象。”我刚才用
var greeter=curl(['mod']);
(对象正确加载)再试了一次和
greeter.sayHi
返回了未定义的对象。curl返回的对象具有
config
next
then
函数。看起来不像curl返回了我告诉它加载的对象。@jcollum以防你不确定我所说的缺少或存在“数组括号”是什么意思,示例:
require(/*无括号*/'a'/*无括号*/)
require(/*括号!!!->*/['a']/*我两种方法都试过了,curl在两种情况下返回相同的对象。你能检查一下你使用的curl版本吗?@jcollum抱歉。
var a=require('o')的用例
在CurlJS中确实非常狭窄。只有一种特殊的本地
require
似乎支持CJS风格的调用。该模块必须包装到
define(function(require){…})
中。感谢您的详细介绍。我想我花了一段时间才“获取”这个AMD的东西。它现在是有意义的。太棒了!从非模块到模块需要一个思维的转变。异步部分使它更难。