【问题标题】:Returning an object "instance" asynchronously through JavaScript通过 JavaScript 异步返回对象“实例”
【发布时间】: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


【解决方案1】:

我认为 Kevin B 已经给了你正确的答案。

考虑到您的时间线和对该主题的不熟悉,我建议您连接并缩小您的 JavaScript 文件,而不是使用异步模块。

否则,您将需要花时间了解如何使用 require 或 yepnope 等模块加载器。您引用的文章没有解决同时加载多个模块的问题,这可能是您的要求。您采用的任何异步脚本加载路径都将要求您利用回调来组织代码执行的顺序。

【讨论】:

    【解决方案2】:
    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() 方法。

    【讨论】:

      【解决方案3】:

      如果我走在正确的轨道上,我想现在而不是几天后知道

      是的。 Promises(就像 jQuery 的 Deferred 实现一样)是要走的路。

      在获取bar的实例和val中

      不完全是。 JS 中的 Promise 不是透明的,它们更像是代理对象。您仍然需要回调:

      getInstance("bar").then(function(val) {
          // this function is executed asynchronously
          // and the `bar` instance is available here
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-22
        • 2020-02-28
        • 2012-06-04
        • 1970-01-01
        • 2020-06-28
        • 1970-01-01
        • 2017-01-15
        • 1970-01-01
        相关资源
        最近更新 更多