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");