Javascript 按一定顺序加载多个脚本
我需要按一定顺序加载几个js脚本。事实上,我用的是typescript,我不能使用jQuery,只能使用纯ts/js。我现在得到的是: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 () {
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
的东西太旧了,所以我想要一些新的方法!