我有以下场景...
$.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()
中执行此操作没有多大意义,因为根据定义,取消 promise 为时已晚。
那么这里最好的方法是什么?
NOTE: This snippet could be executed multiple times. This is why I want to avoid the script from being loaded more than once.
最佳答案
在 .done()
处理程序中取消 Promise 是没有意义的。当调用 .done()
处理程序时,操作已经完成(听起来也许您已经知道了)。因此,当调用 .done()
处理程序时,脚本的加载已经完成。没有什么可以取消的。
如果您只是想防止自己的代码多次尝试加载脚本,那么您实际上并没有使用 Promise。您可以只跟踪自己的标志,也可以测试环境以查看脚本是否已经存在。例如,您可以使用此函数来检查是否已加载以特定文件名结尾的脚本标记:
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");
}
或者,您可以创建自己的 getScript 函数,该函数首先检查它是否已加载:
$.getScriptIfNotLoaded = function(fname) {
if (!isScriptPresent(fname)) {
return $.getScript(fname);
}
}
然后,你可以这样做:
$.getScriptIfNotLoaded("script.js");
并且,它永远不会在同一页面中多次加载。这样做的优点是,脚本首次加载的方式并不重要(即使它位于原始 HTML 中) - 如果它已经在页面中,它将找到它。
<小时/>您还可以跟踪 map 中已加载的内容:
(function() {
var loadedScripts = {};
$.loadScriptOnce = function(fname) {
if (!loadedScripts[fname]) {
loadedScripts[fname] = true;
return $.getScript(fname);
}
};
})();
$.loadScriptOnce("scripts.js");
关于jquery - 如何取消 "done"回调中的 promise ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23204765/