gpt4 book ai didi

jquery - 如何取消 "done"回调中的 promise ?

转载 作者:行者123 更新时间:2023-12-01 04:49:23 25 4
gpt4 key购买 nike

我有以下场景...

$.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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com