Jquery 我如何取消“内部”中的承诺;“完成”;回拨?
我有下面的场景Jquery 我如何取消“内部”中的承诺;“完成”;回拨?,jquery,promise,jquery-deferred,cancellation,Jquery,Promise,Jquery Deferred,Cancellation,我有下面的场景 $.when( $.getScript('script.js') ).done(function () { if ( scriptIsAlreadyLoaded ) { // I want to cancel this promise. // I no longer want script.js because // it has already been loaded in another // i
$.when(
$.getScript('script.js')
).done(function () {
if ( scriptIsAlreadyLoaded ) {
// I want to cancel this promise.
// I no longer want script.js because
// it has already been loaded in another
// instance.
}
// I dont' want this to run if the above
// condition is true.
doStuff();
});
我明白在done()
内这样做没有多大意义,因为根据定义,取消承诺已经太晚了
那么,什么是最好的方法呢
注意:此代码段可以执行多次。这就是为什么我希望避免多次加载脚本
在
.done()
处理程序中取消承诺是没有意义的。调用.done()
处理程序时,操作已经完成(听起来您可能已经知道)。因此,当调用.done()
处理程序时,脚本的加载已经完成。没有什么可以取消的了
如果您只是想阻止自己的代码多次尝试加载脚本,那么您就不会真正使用承诺。您可以只跟踪自己的标志,也可以测试环境以查看脚本是否已经存在。例如,您可以使用此函数检查是否已加载以特定文件名结尾的脚本标记:
function isScriptPresent(fname) {
var regex = new RegExp(fname + "$");
var scripts = document.getElementsByTagName("script");
for (var i = 0; i < scripts.length; i++) {
if (regex.test(scripts[i].src)) {
return true;
}
}
return false;
}
if (!isScriptPresent("script.js")) {
$.getScript("script.js");
}
然后,你可以做:
$.getScriptIfNotLoaded("script.js");
而且,它永远不会在同一页面中多次加载。这样做的好处是,不管脚本是如何第一次加载的(即使它是在原始HTML中),如果它已经在页面中,就会找到它
您还可以跟踪地图中加载的内容:
(function() {
var loadedScripts = {};
$.loadScriptOnce = function(fname) {
if (!loadedScripts[fname]) {
loadedScripts[fname] = true;
return $.getScript(fname);
}
};
})();
$.loadScriptOnce("scripts.js");
嗯。。。在内部,它已经完成了。。。完成。我一点也不明白你想完成什么。只需保留一个布尔标志并用
if
环绕$。当时,使用$.getScript会自动解析脚本,因此即使您取消了它,它也会被加载,所以这没有任何意义。此外,除了@adeneo所说的浏览器缓存脚本(除非您的服务器发送了错误的缓存头),因此,无论如何,它不会第二次发出请求。而且,它似乎可以像->@BenjaminGruenbaum那样完成,我知道它在done()
函数中没有意义(我在帖子中承认了这一点)。我希望我能得到一个真正有意义的替代方案的建议。
(function() {
var loadedScripts = {};
$.loadScriptOnce = function(fname) {
if (!loadedScripts[fname]) {
loadedScripts[fname] = true;
return $.getScript(fname);
}
};
})();
$.loadScriptOnce("scripts.js");