【发布时间】:2013-06-27 14:55:27
【问题描述】:
除了 jQuery 的 AJAX 函数之外,我对 “异步” JavaScript 的理解非常有限。
我创建了一个系统,我将外部 Javascript 文件作为“模块”加载,以保持整洁和轻量级。这样做的主要灵感+实现可以在here找到。
因此,例如,名为foo.js 的 JS 文件可能包含以下具有设置属性的 JS 对象:
var bar = {
a:1,
b:2
}
加载此外部文件后,可通过window.bar 访问它。因此,在浏览器的开发者工具 JS 控制台中输入 window.bar.a(或者 bar.a)应该会返回:
1
当我尝试将 bar 对象分配给一个变量时出现了我的问题,这通常会在加载外部 JS 模块之前同步解决,并且通常包含 undefined - 嘘!
这是我目前的尝试:如果对象实例已经存在于window中,则基本上返回它,否则等待它被加载然后返回它(理想情况下):
var val = getInstance('bar');
调用我的函数:
function getInstance(name) {
if(typeof window[name] === 'object'){
return window[name];
} else {
$(window).on('load', window[name], function() {
return window[name];
});
}
}
当我 console.log(val) 时,当然会返回 undefined。
我知道一个事实,我期望对象 bar 异步到达 val。然后我可以继续并开始通过val 引用bar 实例(即val.a == 1)。
我已经努力浏览了 jQuery 的延迟对象 ($.Deferred) - 我的理解消失了,但我的截止日期很紧,我想现在而不是几天后知道如果我在将bar 实例化为val 方面走在正确的轨道上。
非常感谢任何帮助、指针或 cmets!
【问题讨论】:
-
"否则等待它被加载然后返回它(理想情况下):" 不能异步工作。我建议使用解决此问题的现有框架(例如 requirejs)或构建类似的框架。
-
使用回调函数
-
@KevinB 因此我对整个问题提出了疑问。在不依赖回调的情况下获取实例是我在这里的主要目标 - 它只是 try 并复制我想要实现的目标的占位符代码。
-
不能,一定有回调。即使是一个不断检查它是否可用的 setInterval 也需要一个回调。
-
zesda,您似乎在描述“jsonp”,而没有使用“jsonp”一词。谷歌它并做一些阅读。
标签: javascript jquery asynchronous jquery-deferred