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

标签 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
        // 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/

相关文章:

javascript - 从 Ajax Jsonp 中获取数据

jquery - iOS jquery .live 问题?

javascript - 无法调用 Parse.Promise._continueWhile

javascript - 为什么 promise 会解决?

javascript - jQuery 延迟未被拒绝

javascript - 如何检查是否存在欺骗并且不显示它们

javascript - 如何防止外部JS阻止你的网站加载?

javascript - 是否可以包装异步 JS 函数并在 OCaml 中使用它?

javascript - 从 Promise 获取初始对象

javascript - OOP 和 jQuery : how to init a var with Deferred();