Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“返回一个对象”;“实例”;通过JavaScript异步地_Javascript_Jquery_Asynchronous_Jquery Deferred - Fatal编程技术网

“返回一个对象”;“实例”;通过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)

除了jQuery的AJAX功能外,我对“异步”JavaScript的理解非常有限

我已经创建了一个系统,在这个系统中,我将外部Javascript文件作为“模块”加载,以保持整洁和轻量级。可以找到这样做的主要灵感和实现

因此,例如,名为
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];
        });
    }
}
当I
console.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
});