Javascript 当我有一个脚本数组时,如何等待脚本加载?

Javascript 当我有一个脚本数组时,如何等待脚本加载?,javascript,jquery,arrays,knockout.js,getscript,Javascript,Jquery,Arrays,Knockout.js,Getscript,我有一个脚本对象数组,如下所示: _externalLibraries = [{name: 'knockout', url: '...'}, { name: 'knockoutValidation', url: '....'}]; 然后我试着写下以下内容: loadLibraries: function() { if (_externalLibraries.length === 0) { return; } _externalLibraries.forEach(funct

我有一个脚本对象数组,如下所示:

_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
,并查看它实际上已加载


我可以对代码进行哪些更改或添加,使其显示“确定我需要等待,直到加载此数组中的每个脚本。”然后执行我想执行的其他操作。

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

var\u外部库=[{
名称:“淘汰赛”,
url:“https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.0/knockout-min.js"
}, {
名称:“敲除验证”,
url:“https://cdnjs.cloudflare.com/ajax/libs/knockout-validation/2.0.3/knockout.validation.js"
}];
var loadedLibraries=[];
$.when.apply($,$.map(_外部库,函数(库){
返回$.getScript(lib.url,函数(){
loadedLibraries.push(lib.name)
})
}))
.然后(函数(){
log(loadedLibraries、ko、ko.validation)
},函数err(jqxhr,textStatus,errorshown){
console.log(textStatus,errorshown)
})

您可以利用
$.when()
函数.prototype.apply()

var\u外部库=[{
名称:“淘汰赛”,
url:“https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.0/knockout-min.js"
}, {
名称:“敲除验证”,
url:“https://cdnjs.cloudflare.com/ajax/libs/knockout-validation/2.0.3/knockout.validation.js"
}];
var loadedLibraries=[];
$.when.apply($,$.map(_外部库,函数(库){
返回$.getScript(lib.url,函数(){
loadedLibraries.push(lib.name)
})
}))
.然后(函数(){
log(loadedLibraries、ko、ko.validation)
},函数err(jqxhr,textStatus,errorshown){
console.log(textStatus,errorshown)
})


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