untitled-rhythm-game/js/1-jsloader.js
2025-04-22 23:21:12 +08:00

97 lines
2.8 KiB
JavaScript

//jsloader.js
(function() {
if(typeof XMLHttpRequest!="function") {
if(typeof loadfail=="function") {
loadfail("1-jsloader.js: XMLHttpRequest(type of "+(typeof XMLHttpRequest)+") is not a function");
} else {
window.alert("1-jsloader.js: XMLHttpRequest(type of "+(typeof XMLHttpRequest)+") is not a function");
}
return;
}
var ScriptManager= {};
ScriptManager.loading_count=0;
ScriptManager.loadjs=async function(pth) {
var resolve;
var reject;
var ret=new Promise(function(s, r) {
resolve=s;
reject=r;
});
var xhr=new XMLHttpRequest();
var onreadystatechange=async function() {
if(xhr.readyState!=XMLHttpRequest.DONE) {
return;
}
removelisteners();
ScriptManager.loading_count--;
if(xhr.status!=200) {
onfail();
return;
}
console.debug("script "+pth+" fetched successfully.");
try {
var fn=new Function(xhr.responseText);
Object.defineProperty(fn, "name", {"value":pth});
var re=await fn();
if(typeof re=="function") {
await re();
} else {
await re;
}
} catch(e) {
console.error(e);
onfail();
return;
}
console.debug("script "+pth+" loaded.");
resolve();
return;
};
var onfail=function() {
removelisteners();
xhr.abort();
window.loadfail("script "+pth+" load failed");
reject("script "+pth+" load failed");
};
var removelisteners=function() {
xhr.removeEventListener("readystatechange", onreadystatechange);
xhr.removeEventListener("error", onfail);
xhr.removeEventListener("abort", onfail);
};
xhr.addEventListener("readystatechange", onreadystatechange);
xhr.addEventListener("error", onfail);
xhr.addEventListener("abort", onfail);
xhr.open("GET", pth, true);
xhr.send();
ScriptManager.loading_count++;
return ret;
};
ScriptManager.isDone=function() {
return ScriptManager.loading_count==0;
};
ScriptManager.waitAll=async function() {
return new Promise(function(resolve, reject) {
var i;
i=setInterval(function() {
if(ScriptManager.loading_count==0) {
clearInterval(i);
resolve();
}
}, 100);
});
};
window.ScriptManager=ScriptManager;
})();