“返回一个对象”;“实例”;通过JavaScript异步地
除了jQuery的AJAX功能外,我对“异步”JavaScript的理解非常有限 我已经创建了一个系统,在这个系统中,我将外部Javascript文件作为“模块”加载,以保持整洁和轻量级。可以找到这样做的主要灵感和实现 因此,例如,名为“返回一个对象”;“实例”;通过JavaScript异步地,javascript,jquery,asynchronous,jquery-deferred,Javascript,Jquery,Asynchronous,Jquery Deferred,除了jQuery的AJAX功能外,我对“异步”JavaScript的理解非常有限 我已经创建了一个系统,在这个系统中,我将外部Javascript文件作为“模块”加载,以保持整洁和轻量级。可以找到这样做的主要灵感和实现 因此,例如,名为foo.JS的JS文件可能包含以下具有设置属性的JS对象: var bar = { a:1, b:2 } 加载此外部文件后,可以通过window.bar访问该文件。因此,在浏览器的开发者工具JS控制台中键入window.bar.a(或者bar.a)
foo.JS
的JS文件可能包含以下具有设置属性的JS对象:
var bar = {
a:1,
b:2
}
加载此外部文件后,可以通过window.bar
访问该文件。因此,在浏览器的开发者工具JS控制台中键入window.bar.a
(或者bar.a
)应该会返回:
1
当我尝试将bar
对象分配给一个变量时,我的问题就出现了,这通常会在外部JS模块加载之前同步解决,并且通常包含未定义的-boo
这是我迄今为止的尝试:如果对象实例已经存在于窗口中,则基本上返回该实例,否则等待加载对象实例,然后返回它(理想情况下):
这调用了我的函数:
function getInstance(name) {
if(typeof window[name] === 'object'){
return window[name];
} else {
$(window).on('load', window[name], function() {
return window[name];
});
}
}
当Iconsole.log(val)
时,它当然返回undefined
我知道这里有一个事实,我希望对象bar
异步通过val
。然后我可以继续并开始通过val
(即val.a==1
)引用bar
实例
我已经努力浏览了jQuery的延迟对象($.Deferred
)——我对它的理解消失了,但我的最后期限很紧,我想知道现在,而不是几天之后,我是否在正确的轨道上,将bar
实例导入val
非常感谢您的帮助、指点或评论
var ajaxRequests = [];
var scriptUrlCollection = ['script1.js', 'script2.js', 'script3.js'];
$(scriptUrlCollection).each(function( index, url ) {
ajaxRequests.push($.getScript(url));
});
$.when.apply($, ajaxRequests).done(function() { / *execute your code */);
由于延迟对象的存在,您可以使用ajax加载脚本,然后在所有脚本完成后执行代码
每个ajax请求返回一个jQuery延迟对象,我们将其添加到ajaxRequests
数组中。当所有这些延迟对象都被解析后,将执行done()
方法。我认为Kevin B已经给了您正确的答案
考虑到您的时间线和对该主题的不熟悉,我建议您连接并缩小JavaScript文件,而不是执行异步模块
否则,您将需要花费时间来理解如何使用模块加载器,如require或yepnope。您参考的文章没有涉及同时加载多个模块,这可能是您的一个要求。异步脚本加载的任何路径都需要利用回调来组织代码的执行顺序
我想现在就知道,而不是几天以后就知道我是否走上了正确的道路
对。(就像jQuery的延迟实现)是一条路要走
在将bar的实例获取到val中时
不完全是。JS中的承诺是不透明的,它们更像代理对象。您仍然需要回调:
getInstance("bar").then(function(val) {
// this function is executed asynchronously
// and the `bar` instance is available here
});
否则,请等待它被加载,然后返回它(理想情况下):“无法异步工作。”。我建议使用解决此问题的现有框架(如requirejs)或构建类似的框架function@KevinB因此,我对整件事提出了问题。我的主要目标是在不依赖回调的情况下获得一个实例——它只是一个占位符代码,用于尝试和复制我试图实现的内容。你不能,必须有回调。即使是连续检查是否可用的setInterval也需要回调。zesda,您似乎在描述“jsonp”,而没有使用术语“jsonp”。用谷歌搜索它,然后阅读。
getInstance("bar").then(function(val) {
// this function is executed asynchronously
// and the `bar` instance is available here
});