【问题标题】:jQuery deferred: cancel progressjQuery延迟:取消进度
【发布时间】:2013-05-02 10:21:43
【问题描述】:

有没有办法取消正在进行的延迟回调队列? 我有任意数量的 ajax 调用。当成功数据返回特定标记时,我想停止进一步的 ajax 请求:

this.oDeferred=$.Deferred();
this.oChain=this.oDeferred;

for(var i=0; i<this.aKey.length; i++) {
    (function(iKey,self) {
        self.oChain=self.oChain.then(function(){
            return $.ajax({
                url:self.aUrl[iKey],
                type:'post',
                data:{'ajax':true},
                dataType:'json',
                success:function(data) {
                    if(data.bCancel==true) {
                        //stop deferred object here!
                    }
                }
            });
        })
    }(this.aKey[i],this))
}

this.oDeferred.done(function() {
    console.log('done')
});
this.oDeferred.resolve()

顺便说一句,在发出所有 ajax 请求后,函数 done() 会自动触发。所有ajax请求完成后如何执行函数?

提前谢谢你!

【问题讨论】:

    标签: javascript jquery deferred


    【解决方案1】:

    答案是肯定的。有两种方法。

    .then()

    .then() 方法返回一个新的 Promise,其状态由传递给该方法的处理程序返回的内容决定。

    • 通过返回一个非 Promise 的值/对象,一个新的 Promise 会沿方法链向下传递,其状态与原始 Promise 相同,但使用返回的值/对象解决/拒绝。
    • 通过返回一个 Promise,该 Promise 将沿方法链向下传递,其状态与原始 Promise 无关。

    因此,延迟/承诺回调队列可以通过从.then() 处理程序返回一个永不解决且永不拒绝的承诺来有效地取消。可以从.then() 处理程序的完成处理程序(第一个参数)或其失败处理程序(第二个参数)做出这样的承诺。使用.done().fail().always() 方法无法实现相同的效果,这些方法无需修改即可返回原始的 Deferred/promise。

    抛出错误

    .then().done().fail().always().progress() 处理程序中抛出的未捕获错误将通过终止正在运行的事件线程来终止方法链。

    可以故意抛出错误,例如throw('deliberate error')

    注意

    应该注意的是,这两种方法都只会抑制链式方法处理程序(或通过赋值实现的等价物)。

    无论采用哪种方法,在抑制返回/错误表达式执行时已经启动的任何异步进程都将继续,并且任何已经到位的相应完成/失败/始终/进度处理程序都可能触发。

    【讨论】:

      【解决方案2】:

      通读 jQuery 文档,似乎没有内置的方法来做你想做的事。有一个插件可以将您带到您需要被称为jQuery-timing 的地方。此线程也可能与您相关Canceling a Deferred Promise in jQuery

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-16
        • 1970-01-01
        • 2012-03-25
        • 1970-01-01
        • 2019-10-26
        • 1970-01-01
        • 1970-01-01
        • 2019-08-05
        相关资源
        最近更新 更多