【问题标题】:How do I wait till the scripts are loaded, when I have an array of scripts?当我有一组脚本时,如何等到脚本加载完毕?
【发布时间】:2016-07-31 02:43:23
【问题描述】:

我有一个这样的脚本对象数组:

_externalLibraries = [{name: 'knockout', url: '...'}, { name: 'knockoutValidation', url: '....'}];

然后我尝试写以下内容:

loadLibraries: function() {
  if (_externalLibraries.length === 0) {
    return;
  }

  _externalLibraries.forEach(function(lib){
    // Check if the libraries has been registered as "loaded."
    var librarysAlreadyLoaded = _loadedLibraries.filter(function(libAlreadyLoaded){
      return libAlreadyLoaded.name === lib.name;
    });

    // If it hasn't been loaded. Load it. This allows for mul;tiple widgets to be on the page.
    // Or this file (for what ever reason) to be called multiple times.
    console.log(librarysAlreadyLoaded);
    if (librarysAlreadyLoaded.length === 0) {
      $.getScript(lib.url, function(){
        _loadedLibraries.push({name: lib.name});
      });
    }
  });
},

基本上我要做的是说在这个数组中加载库,如果它还没有被加载的话。如果还没有,则加载它并将名称添加到“加载的库”数组中。

问题是“ko 未定义”,至少对于淘汰赛和淘汰赛验证而言。页面加载后,我可以在控制台中输入ko 并查看它实际上已加载。

我可以更改或添加到代码中以使其显示“好的,我需要等到加载此数组中的每个脚本”。然后做我想做的其他事情。

【问题讨论】:

  • 你可以使用 requirejs 之类的东西,这样你就不必自己映射依赖项了吗?
  • 不,我们没有针对特定项目的选项。
  • 很公平。您需要在脚本对象数组中指出哪些脚本需要哪些其他脚本,然后确保不要加载具有已卸载依赖项的脚本。这也意味着一个简单的一次性加载器循环将不再起作用,因为当依赖到达时您必须重新访问列表以在任何给定脚本到达后找到要加载的下一个逻辑脚本。或者,您提前构建了一个依赖树,但这更加复杂。
  • 你能举个例子回答一下,这样我就能更好地理解你在说什么
  • 不,无论如何这都不是一件小事,尤其是在错误处理方面。如果不是更多的话,它必须有几十行,这就是为什么我最初问你是否可以使用经过测试和常见的东西而不是重新发明一个相当复杂的轮子......简单的答案是 document.write() 你的数组按他们需要的顺序排列脚本,除了性能之外,这会很好......

标签: javascript jquery arrays knockout.js getscript


【解决方案1】:

您可以使用$.when()Function.prototype.apply()

var _externalLibraries = [{
  name: "knockout",
  url: "https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.0/knockout-min.js"
}, {
  name: "knockoutValidation",
  url: "https://cdnjs.cloudflare.com/ajax/libs/knockout-validation/2.0.3/knockout.validation.js"
}];

var loadedLibraries = [];

$.when.apply($, $.map(_externalLibraries, function(lib) {
  return $.getScript(lib.url, function() {
    loadedLibraries.push(lib.name)
  })
}))
.then(function() {
  console.log(loadedLibraries, ko, ko.validation)
}, function err(jqxhr, textStatus, errorThrown) {
    console.log(textStatus, errorThrown)
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
</script>

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-06-30
  • 1970-01-01
  • 2013-10-12
  • 2023-03-28
  • 1970-01-01
  • 2012-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多