正确检查 Javascript 的加载
Check loading of Javascript properly
我有 10 个 js 文件。我在 java class 加载之前加载所有文件。但是我需要检查是否所有文件都已正确加载,然后我调用 java class.
首先我调用一个 js 文件来加载我所有需要的 js 文件,这里我需要检查我所有的 10 个 js 文件是否正确加载然后我需要调用一个函数。
这是我的代码
loadpackage("0.js",callback);
loadpackage("1.js",callback);
loadpackage("2.js",callback);
loadpackage("3.js",callback);
loadpackage("4.js",callback);
loadpackage("5.js",callback);
loadpackage("6.js",callback);
loadpackage("7.js",callback);
loadpackage("8.js",callback);
loadpackage("9.js",callback);
loadpackage("10.js",callback);
function loadpackage(path, callback) {
var done = false;
var scr = document.createElement('script');
scr.onload = handleLoad;
scr.onreadystatechange = handleReadyStateChange;
scr.onerror = handleError;
scr.src = path;
document.body.appendChild(scr);
function handleLoad() {
if (!done) {
done = true;
callback(path, "ok");
}
}
function handleReadyStateChange() {
console.log("readystate1");
var state;
if (!done) {
console.log("readystate2");
state = scr.readyState;
console.log("readystate3");
if (state === "complete") {
console.log("readystate4");
handleLoad();
}
}
}
function handleError() {
if (!done) {
done = true;
callback(path, "error");
}
}
}
function callback(path, message) {
console.log(path+" :: "+message);
}
我在某些地方读到 onreadystatechange
事件表明文件已成功加载,但此处 onreadystatefunction
未调用。
所以请帮助我解决这个问题,如何检查我的所有 10 个 js 文件是否正确加载。
一些问题使用 jQuery 回答了这个问题,但我不能使用 jQuery,我需要 JavaScript 或 GWT
中的答案
框架:GWT 2.6.0
我正在开发 GWT,其中使用 Java Class 并执行一些我需要加载 js 文件的操作
创建一些计数器,然后在每次 onload
回调触发时递减它。当它达到 0 时,执行您需要的操作。
var scripts = ['1.js', '2.js', ...]
var scriptsToLoad = scripts.length
scripts.forEach(loadScript)
function loadScript (path) {
var scr = document.createElement('script')
scr.onload = function () {
scriptsToLoad -= 1
if (scriptsToLoad === 0) doYourJavaThing()
}
scr.src = path
document.body.appendChild(scr)
}
function doYourJavaThing () {
// la la la
}
正如我所见,在这种情况下你将不得不使用 Promise,这意味着你加载脚本的函数将非常方便地返回这样的承诺:
//Change your function to this:
function loadpackage( path, resolve, reject ) {
var done = false;
var scr = document.createElement('script');
scr.onload = handleLoad;
scr.onreadystatechange = handleReadyStateChange;
scr.onerror = handleError;
scr.src = path;
document.body.appendChild(scr);
function handleLoad() {
if (!done) {
done = true;
resolve( { path:path,status:'ok' } );
}
}
function handleReadyStateChange() {
console.log("readystate1");
var state;
if (!done) {
console.log("readystate2");
state = scr.readyState;
console.log("readystate3");
if (state === "complete") {
console.log("readystate4");
handleLoad();
}
}
}
function handleError() {
if (!done) {
done = true;
reject( { path:path,status:'error' } );
}
}
}
//Use promises
var promises = [];
promises.push( new Promise( function( resolve,reject ){
loadpackage( "0.js", resolve, reject )
}) );
promises.push( new Promise( function( resolve,reject ){
loadpackage( 'path', resolve, reject )
}) );
promises.push( new Promise( function( resolve,reject ){
loadpackage( "1.js", resolve, reject )
}) );
//...etc
//And finally wait untill all of them are resolved
Promise.all( promises ).then( function( value ){
//Here you absolutely know that all files have loaded,
//and you can fire callback here for each of them like
callbak( value.path, value.status );
});
我有 10 个 js 文件。我在 java class 加载之前加载所有文件。但是我需要检查是否所有文件都已正确加载,然后我调用 java class.
首先我调用一个 js 文件来加载我所有需要的 js 文件,这里我需要检查我所有的 10 个 js 文件是否正确加载然后我需要调用一个函数。
这是我的代码
loadpackage("0.js",callback);
loadpackage("1.js",callback);
loadpackage("2.js",callback);
loadpackage("3.js",callback);
loadpackage("4.js",callback);
loadpackage("5.js",callback);
loadpackage("6.js",callback);
loadpackage("7.js",callback);
loadpackage("8.js",callback);
loadpackage("9.js",callback);
loadpackage("10.js",callback);
function loadpackage(path, callback) {
var done = false;
var scr = document.createElement('script');
scr.onload = handleLoad;
scr.onreadystatechange = handleReadyStateChange;
scr.onerror = handleError;
scr.src = path;
document.body.appendChild(scr);
function handleLoad() {
if (!done) {
done = true;
callback(path, "ok");
}
}
function handleReadyStateChange() {
console.log("readystate1");
var state;
if (!done) {
console.log("readystate2");
state = scr.readyState;
console.log("readystate3");
if (state === "complete") {
console.log("readystate4");
handleLoad();
}
}
}
function handleError() {
if (!done) {
done = true;
callback(path, "error");
}
}
}
function callback(path, message) {
console.log(path+" :: "+message);
}
我在某些地方读到 onreadystatechange
事件表明文件已成功加载,但此处 onreadystatefunction
未调用。
所以请帮助我解决这个问题,如何检查我的所有 10 个 js 文件是否正确加载。
一些问题使用 jQuery 回答了这个问题,但我不能使用 jQuery,我需要 JavaScript 或 GWT
中的答案框架:GWT 2.6.0
我正在开发 GWT,其中使用 Java Class 并执行一些我需要加载 js 文件的操作
创建一些计数器,然后在每次 onload
回调触发时递减它。当它达到 0 时,执行您需要的操作。
var scripts = ['1.js', '2.js', ...]
var scriptsToLoad = scripts.length
scripts.forEach(loadScript)
function loadScript (path) {
var scr = document.createElement('script')
scr.onload = function () {
scriptsToLoad -= 1
if (scriptsToLoad === 0) doYourJavaThing()
}
scr.src = path
document.body.appendChild(scr)
}
function doYourJavaThing () {
// la la la
}
正如我所见,在这种情况下你将不得不使用 Promise,这意味着你加载脚本的函数将非常方便地返回这样的承诺:
//Change your function to this:
function loadpackage( path, resolve, reject ) {
var done = false;
var scr = document.createElement('script');
scr.onload = handleLoad;
scr.onreadystatechange = handleReadyStateChange;
scr.onerror = handleError;
scr.src = path;
document.body.appendChild(scr);
function handleLoad() {
if (!done) {
done = true;
resolve( { path:path,status:'ok' } );
}
}
function handleReadyStateChange() {
console.log("readystate1");
var state;
if (!done) {
console.log("readystate2");
state = scr.readyState;
console.log("readystate3");
if (state === "complete") {
console.log("readystate4");
handleLoad();
}
}
}
function handleError() {
if (!done) {
done = true;
reject( { path:path,status:'error' } );
}
}
}
//Use promises
var promises = [];
promises.push( new Promise( function( resolve,reject ){
loadpackage( "0.js", resolve, reject )
}) );
promises.push( new Promise( function( resolve,reject ){
loadpackage( 'path', resolve, reject )
}) );
promises.push( new Promise( function( resolve,reject ){
loadpackage( "1.js", resolve, reject )
}) );
//...etc
//And finally wait untill all of them are resolved
Promise.all( promises ).then( function( value ){
//Here you absolutely know that all files have loaded,
//and you can fire callback here for each of them like
callbak( value.path, value.status );
});