Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/452.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_Typescript_Onload - Fatal编程技术网

Javascript 按一定顺序加载多个脚本

Javascript 按一定顺序加载多个脚本,javascript,typescript,onload,Javascript,Typescript,Onload,我需要按一定顺序加载几个js脚本。事实上,我用的是typescript,我不能使用jQuery,只能使用纯ts/js。我现在得到的是: var script1 = document.createElement('script'); script1.type = 'text/javascript'; script1.src = 'script1.js'; document.head.appendChild(script1); script1.onload = function () {

我需要按一定顺序加载几个js脚本。事实上,我用的是typescript,我不能使用jQuery,只能使用纯ts/js。我现在得到的是:

var script1 = document.createElement('script');
script1.type = 'text/javascript';
script1.src = 'script1.js';
document.head.appendChild(script1);
script1.onload = function () {

    var script2 = document.createElement('script');
    script2.type = 'text/javascript';
    script2.src = 'script2.js';
    document.head.appendChild(script2);
    script2.onload = function () {

        etc...

    }

}

这是可行的,但我相信有更优雅的方法可以做到这一点?请给出普通javascript或typescript的示例。

是!有。使用
承诺
异步/等待

function loadScript(url) {
  return new Promise((resolve, reject) => {
    const script = document.createElement('script')
    script.src = url
    document.head.appendChild(script)
    script.onload = () => resolve()
  })
}

async function loadScripts() {
  await loadScript('script1.js')
  await loadScript('script2.js')
  // ..
}

loadScripts().then(_ => console.log('All scripts loaded in specified order'))

更优雅的方法可能是下面的代码,首先定义所有内容,但仍按上面的顺序加载所有内容。这将使用一个helper函数进行追加,然后设置下一个脚本的load函数,并将脚本引用存储在一个数组中,以简化此操作

/*
* Load the scripts in a specific order
*/
function loadScripts() {
    var scripts = [];
    var numScripts = 2
    for (let i=0; i<numScripts, i++) {
        scripts[i] = document.createElement('script');
        scripts[i].type = 'text/javascript';
        scripts[i].src = '"script"+i+".js"; //NOTE: if your scripts start on 1, not 0, you need "i+i"
    }
    loadScriptHelper(scripts,0);
}

/*
* Helper function for load scripts
*/
function loadScriptHelper(scripts,i) {
    document.head.appendChild(scripts[i]);
    scripts[i].onload = function() {
        loadScriptHelper(scripts,i+1);
    }
}
/*
*按特定顺序加载脚本
*/
函数loadScripts(){
var脚本=[];
var numcripts=2

对于(设i=0;我如何在TypeScript中执行此操作?valid javascript是valid TypeScript@Martin出于好奇,您能解释一下这一切是如何工作的吗?我不熟悉以这种方式使用承诺。
loadScript
返回一个承诺,该承诺只有在调用resolve或reject时才会得到解决。我正在对脚本l调用
resolve
oad回调。
await
在继续之前等待承诺解析,因此它将等待脚本间接加载(因为承诺解析的时候就是脚本加载的时候)。因此,在某种意义上,我现在看到,通过在loadScripts()中使用await,在@brandonixonah完成了任务您正在强制同步加载脚本,但是loadScripts()本身是异步的,这一事实仍然以异步的方式完成了工作。谢谢,伙计!我正在考虑制作一个函数(干式-不要重复自己),但我觉得这个
onload
的东西太旧了,所以我想要一些新的方法!