jQuery Deferred - 如何中止长时间运行的请求

时间:2014-06-09 02:09:53

标签: javascript jquery deferred

我的问题是我需要一种方法来中止延迟以阻止我的应用程序中发生的错误。

我创建了一个jsfiddle,其中简单概述了我的问题,即do处理程序正在尝试对api调用启动和完成之间删除的元素进行操作。

以下是我的问题概述 - http://jsfiddle.net/gfNMA/3/

这里我有多远

api: function(options) {
    var self = this,
        deferred = $.Deferred(),
        handle = function() {
            if (!self || !self.element) {
                // I need to clear the deferred here
                // E.g deferred.abort()
            }

            deferred[arguments[1] === 'success' ? 'resolve' : 'reject']
                .apply(null, arguments);
        }

    $.ajax(options).always(handle);

    return deferred;
}

1 个答案:

答案 0 :(得分:1)

延迟的对象/承诺无法真正中止。它也没有多大意义,因为多个不同的分支可能取决于承诺的结果,你不会想要中止"整个承诺只是因为一个分支不需要结果。

相反,您可以将该Ajax承诺包装到另一个承诺中,该承诺首先测试该元素是否存在。如果它不存在,拒绝承诺。

function ifElementExists(element) {
    return function(result) {
        var deferred = new $.Deferred();
        if (element) { // test if element exists somehow
            deferred.resolve(result);
        }
        else {
            deferred.reject();
        }
        return deferred.promise();
   }
}

api(...).then(ifElementExists(element)).then(doSomething);

当然,您还可以测试元素是否直接存在于最终回调中(没有中间承诺)。